ric*_*ard 1 activerecord attributes ruby-on-rails ruby-on-rails-3 rails-activerecord
我有一个模型(下面的简化版本-全一个有很多更多的字段)上,我想做一个搜索.
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
Run Code Online (Sandbox Code Playgroud)
由于高级搜索表单几乎与用于创建/更新模型实例的表单相同,我想创建一个方法,动态查看请求的参数列表,并通过名称将表单字段与模型属性进行匹配.所以,如果搜索请求是,
/search?utf8=?&ref_code=111&title=test&subject=code&commit=Search
Run Code Online (Sandbox Code Playgroud)
然后我的控制器可以调用Media.search(params)并返回一个范围,在相应的字段中搜索适当的值.正如您所看到的,我尝试使用respond_to?
但是仅为模型的实例而不是实际的模型类定义,我需要忽略与模型无关的任何参数(例如,在这种情况下为utf8和commit).如果这一切都运行良好,我计划重构代码,以便我可以为多个模型重用相同的方法.
有类似的类方法respond_to?
吗?你会怎么做同样的任务?
我知道这与在rails 3中动态获取模型属性有关,但它并没有真正回答我正在尝试做的事情,因为我想在模型而不是模型的实例上做.
ActiveRecord模型类上有一个columns
方法,因此您可以轻松获取属性名称列表:
names = Model.columns.map(&:name)
Run Code Online (Sandbox Code Playgroud)
您可以轻松地删除一些常见的:
names = Model.columns.map(&:name) - %w[id created_at updated_at]
Run Code Online (Sandbox Code Playgroud)
本accessible_attributes
类方法也很感兴趣,会告诉你已经给attr_accessible
.
归档时间: |
|
查看次数: |
619 次 |
最近记录: |