【问题标题】:Dynamically determining Rails model attributes动态确定 Rails 模型属性
【发布时间】:2013-01-15 04:23:26
【问题描述】:

我有一个模型(下面的简化版本 - 完整模型有 很多 更多字段)我想在其上进行搜索。

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并在这种情况下提交)。如果这一切正常,我计划重构代码,以便我可以为多个模型重用相同的方法。

有没有类似respond_to?的类方法?您将如何处理相同的任务?

我知道这与 get model attribute dynamically in rails 3 有关,但它并没有真正回答我想要做的事情,因为我想在 model 而不是 instance 上做模型

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord attributes rails-activerecord


    【解决方案1】:

    ActiveRecord 模型类上有一个columns method,因此您可以轻松获取属性名称列表:

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

    您可以轻松删除一些常见的:

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

    accessible_attributes 类方法也可能很有趣,它会告诉你 attr_accessible 得到了什么。

    【讨论】:

    • 谢谢。列方法非常适合我的需求!我总是发现很难在 API 中找到我需要的东西,因为一切都分布在如此多的类和模块中。
    • 快速更新:我还偶然发现了columns_hash,它使用列名作为键,使用与columns 相同的信息作为值。
    猜你喜欢
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 2016-03-17
    • 2019-03-04
    • 1970-01-01
    相关资源
    最近更新 更多