8

次のように、配列に基づいて最近の本のクエリを実行できることを知っています

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

しかし、アイテムの配列がある場合に同様のクエリを実行するにはどうすればよいですか。たとえば、[date1、date2、date3 など] の配列の日付に一致するレコードがあるかどうかを知りたい場合はどうすればよいですか?

それを行う収集/注入/選択/マップ y メソッドが必要だと思いますが、どれを読んでもわかりません。

4

2 に答える 2

17

配列を値として渡すと、ActiveRecord は配列に含まれるかどうかを比較するのに十分スマートです。例えば、

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

WHERE次のような句を含む SQL クエリを生成します。

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

次に、単一の ID または ID の配列を に渡すby_authorと、次のように機能します。

Book.by_author([1,7,42])
于 2011-11-16T16:38:17.137 に答える
5

Rails 4 では、次のようなスコープを使用して、配列属性に文字列が含まれているかどうかを確認できます。

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

または引数付き:

scope :by_category, ->(category) { where(:categories => "{#{category}}") }
于 2014-11-03T00:07:33.317 に答える