我有一个模型(下面的简化版 - 完整版有更多字段),我想在其上进行搜索。
class Media < ActiveRecord::Base
attr_accessible :subject, :title, :ref_code
validates :title, :presence => true
validates :subject, :presence => true
def self.search(terms_hash)
return if terms_hash.blank?
composed_scope = self.scoped
terms_hash.each_pair do |key, value|
if self.respond_to? key and not value.is_blank?
value.split(' ').each do |term|
term = "%#{term}%"
composed_scope = composed_scope.where("#{key} LIKE ?", term)
end
end
composed_scope
end
end
由于高级搜索表单与用于创建/更新模型实例的表单几乎相同,因此我想创建一个方法来动态查看请求的参数列表并通过名称将表单字段与模型属性匹配。所以如果搜索请求是,
/search?utf8=✓&ref_code=111&title=test&subject=code&commit=Search
然后我的控制器可以只调用 Media.search(params) 并且它将返回一个范围,该范围将在适当的字段中搜索适当的值。如您所见,我尝试使用respond_to?
但仅针对模型实例而不是实际模型类定义,并且我需要忽略与模型无关的任何参数的东西(例如,在这种情况下为 utf8 和 commit)。如果这一切正常,我计划重构代码,以便我可以为多个模型重用相同的方法。
有没有类似的类方法respond_to?
?你将如何处理相同的任务?
我知道这与在 rails 3 中动态获取模型属性有关,但它并没有真正回答我想要做的事情,因为我想在模型上而不是在模型的实例上做。