Frage

I know that I can do a query for recent books based on an array as in

scope :recent_books, lambda {|since_dt| {:conditions=>{:created_at >= since_dt}}}

but how can I do a similar query when I have an array of items, e.g. what if I want to know if there any records that match the dates in an array of [date1, date2, date3, etc.]

I think there must be a collect/inject/select/map y method that'll do it but I am not sure which from reading them.

War es hilfreich?

Lösung

If you pass an array as the value, ActiveRecord is smart enough to compare for inclusion in the array. For example,

Book.where(:author_id => [1, 7, 42])

produces a SQL query with a WHERE clause similar to:

WHERE "author_id" IN (1, 7, 42)

You can take advantage of this in a scope the same way you would set normal conditions:

class Book < ....
  # Rails 3
  scope :by_author, lambda { |author_id| where(:author_id => author_id) }

  # Rails 2
  named_scope :by_author, lambda { |author_id
    { :conditions => {:author_id => author_id} }
  }
end

Then you can pass a single ID or an array of IDs to by_author and it will just work:

Book.by_author([1,7,42])

Andere Tipps

In Rails 4, I can check for the inclusion of a string in an array attribute by using a scope like this:

scope :news, -> { where(:categories => '{news}') }

Or with an argument:

scope :by_category, ->(category) { where(:categories => "{#{category}}") }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top