动态确定Rails模型属性



我有一个模型(下面的简化版本-完整的一个有一个lot更多字段),我想做一个搜索。

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中动态获取模型属性有关,但它并没有真正回答我要做的事情,因为我想在模型上做,而不是模型的实例。

在ActiveRecord模型类上有一个columns方法,所以你可以很容易地获得属性名称列表:

names = Model.columns.map(&:name)

你可以很容易地删除一些常见的:

names = Model.columns.map(&:name) - %w[id created_at updated_at]

accessible_attributes类方法可能也很有趣,它将告诉您attr_accessible被赋予了什么。

相关内容

  • 没有找到相关文章

最新更新