How can I use a named scope in my model against an array of items?

后端 未结 2 1525
渐次进展
渐次进展 2021-01-05 12:52

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}}}

相关标签:
2条回答
  • 2021-01-05 13:12

    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])
    
    0 讨论(0)
  • 2021-01-05 13:12

    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}}") }
    
    0 讨论(0)
提交回复
热议问题