ruby-on-rails
  • ruby-on-rails-4
  • activerecord
  • rails-activerecord
  • ruby-on-rails-5
  • 2015-06-28 13 views 64 likes 
    64

    wiem, że istnieją 3 główne zapisy na dostarczanie argumentów metody where ActiveRecord:ActiveRecord OR Hash zapytania notacja

    1. Czysta String
    2. Array
    3. Hash

    Określanie and dla Metoda jest prosta:

    # Pure String notation 
    Person.where("name = 'Neil' AND age = 27") 
    
    # Array notation 
    Person.where(["name = ? AND age = ?", 'Neil', 27]) 
    
    # Hash notation 
    Person.where({name: "Neil", age: 27}) 
    

    Podanie or dla tej samej metody where obciąża mnie hashową składnią. Czy to możliwe?

    # Pure String notation 
    Person.where("name = 'Neil' OR age = 27") 
    
    # Array notation 
    Person.where(["name = ? OR age = ?", 'Neil', 27]) 
    
    # Hash notation DOESN'T WORK 
    Person.where({name: "Neil" OR age: 27}) 
    

    Odpowiedz

    126

    Istnieje 5 opcji, które mogłyby zostać uznane za implementacje «notacji Hash» (dwa ostatnie są trochę hash- owski):

    1. z Ruby on Rails 5 jesteś w stanie wykonać następujące łańcuchowym za pomocą ActiveRecord::Relation#or metody:

      Person.where(name: 'Neil').or(Person.where(age: 27)) 
      
    2. Używaj where_values wraz z reduce. Niezbędny jest model unscopedonly for Rails 4.1+, aby zapewnić, że default_scope nie jest zawarty w where_values.Inaczej predykaty zarówno default_scope i where będzie przykuty z operatorem or:

      Person.where( 
          Person.unscoped.where(name: ['Neil'], age: [27]).where_values.reduce(:or) 
      ) 
      
    3. Instalowanie wtyczek innych firm, które implementują te lub podobne funkcje, na przykład:

      • Where Or(backport od wspomniana wyżej funkcja Ruby on Rails 5 .or)

      • Squeel

        Person.where{(name == 'Neil') | (age == 27)} 
        
      • RailsOr

        Person.where(name: 'Neil').or(age: 27) 
        
      • ActiverecordAnyOf

        Person.where.anyof(name: 'Neil', age: 27) 
        
      • SmartTuple

        Person.where(
            (SmartTuple.new(' or ') << {name: 'Neil', age: 27}).compile 
        ) 
        
    4. Zastosowanie Arel:

      Person.where( 
          Person.arel_table[:name].eq('Neil').or(
          Person.arel_table[:age].eq(27) 
      ) 
      ) 
      
    5. Zastosowanie przygotowane sprawozdanie z wymienionych parametrów:

      Person.where('name = :name or age = :age', name: 'Neil', age: 27) 
      
    +1

    Jest to pełna odpowiedź. Odpowiedź "arel" jest szczególnie dobra, ponieważ to właśnie dodaje się do Rails 5, jak rozumiem. –

    +0

    Jeśli nie możesz czekać na Rails 5, możesz użyć tego backportu funkcji do szyn 4.2. Ładnie zapakowany jako "gdzie-lub" klejnot https://github.com/Eric-Guo/where-lub – Rob

    +0

    Jeśli twój projekt jest jeszcze w Railsach 3+, możesz wypróbować rails_or gem: https: // github. com/khiav223577/rails_or –

    1

    Jak mówi potashin, można użyć innego wtyczek innych firm, które implementują tę funkcję . Mam długi czas przy użyciu Squeel i działa całkiem dobrze dla tego i wiele więcej funkcji, takich jak złożonych podzapytania lub sprzężeń.

    To zapytanie za pomocą squeel:

    @people= Person.where{(name == 'Neil') | (age = 27)} 
    
    Powiązane problemy