문제

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.

도움이 되었습니까?

해결책

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

다른 팁

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}}") }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top