【问题标题】:Is it possible to dynamically generate a cattr_reader hash from the database?是否可以从数据库动态生成 cattr_reader 哈希?
【发布时间】:2012-11-09 02:58:35
【问题描述】:

我想知道是否可以在我的类中添加与此类似的内容,并让它构建一个我可以在其他类中引用的类属性。我不想记住 id,也不想在权重表中的 id 发生变化时不断更新 id。我也不想将权重表锁定为一组特定的 id。

所以我想做如下的事情:

class Weight < ActiveRecord::Base
  attr_accessible :name

  @@kind = {
    Weight.all.each do |weight|
      weight.name.delete(' ').underscore.to_sym: weight.id,
    end
  }
  cattr_reader :kind, :instance_accessor => false
end

然后在代码的其他区域我可以做类似的事情..

scope :light, where(weight_id, Weight::kind(:light))

我确信有一些神奇的 ruby​​ 方法,我只是不确定正确的语法。

【问题讨论】:

    标签: ruby ruby-on-rails-3 metaprogramming


    【解决方案1】:

    这是我迄今为止最接近的一次。

    def self.kinds
      kinds = Weight.all.map { |weight| { weight.name.delete(' ').underscore.to_sym => weight.id } }
      kinds.reduce({}, :update)
    end
    

    然后……

    scope :light, where(weight_id, Weight.kinds[:light])
    

    【讨论】:

      【解决方案2】:

      为什么不把 kind 访问器变成一个类方法,它会懒惰地从数据库中加载权重并查找必要的权重?

      但是,您尝试做的事情似乎并不好。体重变化背后的表格是什么?在建立数据库连接之前(例如,在某些测试环境中),您的类将被加载?我建议用适当的名称将范围重写为内部连接权重模型...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-07
        • 2010-11-13
        • 1970-01-01
        • 1970-01-01
        • 2017-04-09
        • 2021-03-09
        • 2011-06-08
        相关资源
        最近更新 更多