Ruby on rails 动态确定Rails模型属性

Ruby on rails 动态确定Rails模型属性,ruby-on-rails,ruby-on-rails-3,activerecord,attributes,rails-activerecord,Ruby On Rails,Ruby On Rails 3,Activerecord,Attributes,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

我有一个模型(下面是简化版-完整版有很多字段),我想在上面搜索

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
然后,我的控制器可以调用Media.search(params),它将返回一个范围,该范围将在适当的字段中搜索适当的值。正如您所见,我尝试使用
respond\u to?
,但这只是为模型的实例定义的,而不是实际的模型类,我需要一些忽略与模型无关的任何参数的东西(例如,在本例中为utf8和commit)。如果一切顺利,我计划重构代码,以便可以对多个模型重用相同的方法

是否有类似于
respond\u to?
的类方法?你将如何完成同样的任务

我知道这与相关,但它并没有真正回答我试图做的事情,因为我想在模型上做这件事,而不是在模型的实例上做这件事

names = Model.columns.map(&:name)
您可以很容易地删除一些常见的:

names = Model.columns.map(&:name) - %w[id created_at updated_at]
accessible\u attributes
类方法可能也很有趣,它将告诉您为
attr\u accessible

提供了一个关于ActiveRecord的模型类,因此您可以轻松地获得属性名称列表:

names = Model.columns.map(&:name)
您可以很容易地删除一些常见的:

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

accessible\u attributes
类方法可能也很有趣,它将告诉您对
attr\u accessible

提供了什么,谢谢。columns方法非常适合我的需要!我总是发现很难在API中找到我需要的东西,因为所有东西都分布在这么多的类和模块中。快速更新:我还偶然发现了
列\u hash
,它使用列名作为键,使用与
列相同的信息作为值。谢谢。columns方法非常适合我的需要!我总是发现很难在API中找到我需要的东西,因为所有东西都分布在这么多的类和模块中。快速更新:我还偶然发现了
列\u hash
,它使用列名作为键,使用与
相同的信息作为值。