Я хочу найти записи по комбинации created_on> = some date И name В некотором списке имен.
Для "> =" мне пришлось бы использовать условие sql. Для «IN» мне пришлось бы использовать хэш условий, где ключ: name, а значение - массив имен.
Есть ли способ их совместить?





Вы можете использовать именованные области в рельсах 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")
Для получения дополнительной информации об named_scopes см. Объявление Райана и Railscast на named_scopes.
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
Если вы собираетесь передавать переменные в свои области видимости, вам нужно использовать лямбда.
Уже предложенные названные объемы вполне приемлемы. Классический способ сделать это:
names = ["dave", "jerry", "mike"]
date = DateTime.now
Person.find(:all, :conidtions => ["created_at > ? AND name IN ?", date, names])
Если вы используете более старую версию Rails, запрос Honza близок, но вам нужно добавить круглые скобки для строк, которые помещаются в условие IN:
Person.find(:all, :conditions => ["created_at > ? AND name IN (?)", date, names])
Использование IN может быть неоднозначным: он самый быстрый для целых чисел и самый медленный для списка строк. Если вы обнаружите, что используете только одно имя, обязательно используйте оператор равенства:
Person.find(:all, :conditions => ["created_at > ? AND name = ?", date, name])
Думаю, я буду использовать либо простые поисковики AR, либо Поискгазм.
В named_scopes замечательно то, что они работают и с коллекциями:
class Post < ActiveRecord::Base
named_scope :published, :conditions => {:status => 'published'}
end
@post = Post.published
@posts = current_user.posts.published
Вы можете связать предложение where:
Person.where(name: ['foo', 'bar', 'baz']).where('id >= ?', 42).first