问题
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.
回答1:
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])
回答2:
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}}") }
来源:https://stackoverflow.com/questions/8155177/how-can-i-use-a-named-scope-in-my-model-against-an-array-of-items