【问题标题】:Can a Rails model be associated with the column name of another model?Rails 模型可以与另一个模型的列名相关联吗?
【发布时间】:2015-02-15 10:04:42
【问题描述】:

我正在寻找有关如何解决此 Rails 数据建模问题的链接或文档。这似乎并不直接。

我有一个报告模型,其中包含许多列,例如车轮、断裂、轴承等。在每一列中,我将零件的状态保存为“好”或“坏”。这是简单的部分。

但是,如果在保存报告时这些列中的任何一个“错误”,我将使用 after_save 回调来创建校正模型的新实例。在校正模型中,我保存了 report_id 以及零件的​​名称 - 轮子、断裂等。

然后我希望能够在使用accepts_nested_attributes_for 编辑报告模型的同时编辑校正模型。这可能吗?如何访问与报告列名称对应的校正模型的特定实例?我不确定为此使用不同的方法是否会更好。

如果有任何可能有帮助的链接或文档,我将不胜感激。

谢谢!

【问题讨论】:

    标签: ruby-on-rails data-modeling model-associations


    【解决方案1】:

    查看此处的文档:http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.htmlaccepts_nested_attribute 将使您能够在创建报告的同时为给定报告创建更正。但在您的情况下,您将仅在创建报告后创建更正,所以我认为您不需要使用 Accepts_nested_attribute。

    我认为您想做的事情很容易做到,并且取决于您如何实施报告和更正模型。 假设您的模型与此类似:

    class Report< ActiveRecord::Base
      has_many :corrections
      attr_accessible :wheel, :brake, etc...
      after_save :create_corrections_if_bad_parts
    
      def create_corrections_if_bad_parts
         # For each part if one of them is changed to false, it create a new correction
         self.attributes.keys.each do |key|
           if send(key + "_changed?") and !self.attributes[key]
              # Calling build will fill the report_id for you
              correction = self.corrections.build(broken_part: key)
              correction.save
           end
         end
      end
    end
    
    class Correction < ActiveRecord::Base
      belongs_to :report
      attr_accessible :broken_part
    end
    

    此模型假设每个部分都有一列,但如果部分太多,最好对数据库进行规范化或使用散列来存储所有部分...... 你可以在那里了解更多关于关系的信息:http://guides.rubyonrails.org/association_basics.html

    【讨论】:

    • 谢谢。这真的很有用。我以这种方式设置模型。我的 create_corrections_if_bad_parts 方法有点不同。但是,我将如何访问报告/编辑表单上的每个更正?
    • 我不确定是否理解,但您可以访问属于报告的所有更正,因为有很多关联。如果您执行 report.corrections,您将可以访问链接到给定报告的集合数组 :)
    • 再次感谢!我知道我可以使用report.corrections。我只是想在一个视图中显示太多,这就是我感到困惑的原因。我简化了工作流程以使其更简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多