Как я могу использовать именованную область в моей модели против массива элементов? - PullRequest
6 голосов
/ 16 ноября 2011

Я знаю, что могу сделать запрос для последних книг на основе массива, как в

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

но как я могу сделать аналогичный запрос, когда у меня есть массив элементов, например Что делать, если я хочу знать, есть ли какие-либо записи, которые соответствуют датам в массиве [date1, date2, date3 и т. д.]

Я думаю, что должен быть метод сбора / ввода / выбора / сопоставления y, который это сделает, но я не уверен, кто их читает.

Ответы [ 2 ]

16 голосов
/ 16 ноября 2011

Если вы передаете массив в качестве значения, ActiveRecord достаточно умен, чтобы сравнить его для включения в массив. Например,

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

создает запрос SQL с предложением WHERE, похожим на:

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

Вы можете воспользоваться этим в scope так же, как вы установили бы нормальные условия:

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

Затем вы можете передать один идентификатор или массив идентификаторов by_author, и он будет просто работать:

Book.by_author([1,7,42])
4 голосов
/ 03 ноября 2014

В Rails 4 я могу проверить наличие строки в атрибуте массива, используя такую ​​область видимости:

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

Или с аргументом:

scope :by_category, ->(category) { where(:categories => "{#{category}}") }
...