質問

created_on >= 特定の日付と名前のリスト内の名前の組み合わせでレコードを検索したいと考えています。

">= の場合は SQL 条件を使用する必要があります。「IN」の場合、キーが:name、値が名前の配列である条件のハッシュを使用する必要があります。

2つを組み合わせる方法はありますか?

役に立ちましたか?

解決

Rails 2.1以降では名前付きスコープを使用できます

Class Test < ActiveRecord::Base
  named_scope :created_after_2005, :conditions => "created_on > 2005-01-01"
  named_scope :named_fred, :conditions => { :name => "fred"}
end

それならできます

Test.created_after_2005.named_fred

または、named_scope にラムダを与えて引数を渡すことができます

Class Test < ActiveRecord::Base
  named_scope :created_after, lambda { |date| {:conditions => ["created_on > ?", date]} }
  named_scope :named, lambda { |name| {:conditions => {:name => name}} }
end

それならできます

Test.created_after(Time.now-1.year).named("fred")

他のヒント

古いバージョンの Rails を使用している場合は、Honza のクエリに近いですが、IN 条件に配置される文字列に括弧を追加する必要があります。

Person.find(:all, :conditions => ["created_at > ? AND name IN (?)", date, names])

IN を使用すると、次のような状況が混在する可能性があります。整数の場合は最も速く、文字列のリストの場合は最も遅くなります。1 つの名前だけを使用している場合は、必ず等号演算子を使用してください。

Person.find(:all, :conditions => ["created_at > ? AND name = ?", date, name])

named_scopes の優れた点は、コレクションに対しても機能することです。

class Post < ActiveRecord::Base
  named_scope :published, :conditions => {:status => 'published'}
end

@post = Post.published

@posts = current_user.posts.published

named_scopes の詳細については、を参照してください。 ライアンの発表 そしてその named_scopes での Railscast

class Person < ActiveRecord::Base
  named_scope :registered, lambda { |time_ago| { :conditions => ['created_at > ?', time_ago] } }
  named_scope :with_names, lambda { |names| { :conditions => { :names => names } } }
end

変数をスコープに渡す場合は、ラムダを使用する必要があります。

連鎖させることができます where 句:

Person.where(name: ['foo', 'bar', 'baz']).where('id >= ?', 42).first

すでに提案されている名前付きスコープは非常に優れています。それを行う古典的な方法は次のとおりです。

names = ["dave", "jerry", "mike"]
date = DateTime.now
Person.find(:all, :conidtions => ["created_at > ? AND name IN ?", date, names])

シンプルな AR ファインダーを使用するか、 サーチガスム.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top