Question

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.

Was it helpful?

Solution

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])

OTHER TIPS

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}}") }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top