has_many:如何通过关联及其连接模型属性进行交互?

时间:2012-03-26 19:00:46

标签: ruby-on-rails-3 nested-attributes nested-form-for

我很难解决在连接模型中设置属性的问题吗?

我的模特:

  class Contract < AR::Base 
    has_many :codelines
    has_many :codes, :through => :codelines

    accepts_nested_attributes_for :codes

    attr_accessible :codes_attributes, :codes; :authnum, :st_date, :end_date
  end

  class Codeline < AR::Base
    belongs_to :contract
    belongs_to :code
    units_alloc ...... this is the attribute I would like to set
  end

  class Code < AR::Base
    has_many :codelines
    has_many :contracts, :through => :codelines
  end

我的app / controllers / contracts_controller.rb的新动作

  def new
    @contract = Contract.new
    @contract.codes.build
  end

我在app / views / contracts / _fields.html.haml

中查看的部分内容
  <fieldset><legend>Enter Billing Code Details</legend>
  = f.fields_for :codes do |ff|
     .field
        = ff.label :name, "Code Name"
        %br/
        = ff.text_field :code_name
     .field
     .
     .
   = f.fields_for :codelines do |ff|
     .field
       = ff.label :name, "Units Alloc"
       %br/
       = ff.text_field :units_alloc, :precision => 6, :scale => 2, :size => 10
  </fieldset>

从阅读Rails指南和观看有轨电视#196和#197以及在互联网上研究嵌套属性后,我开始理解我的应用程序的新操作中的 @ contract.codes.build 行/controllers/contracts_controller.rb不仅构建了代码对象,还构建了代码行对象。如果我将我的app / controllers / contracts_controller.rb的新动作留在上面,那就是正是发生的事情。我的代码行表填充如下:

    id       contract_id       code_id       units_alloc
     1             1                1                  .... @contract.codes.build

但是如果你看一下我的观点,我实际上想设置units_alloc,这行 @ contract.codes.build 不允许我访问units_alloc,因为它在代码行模型中。我将 @ contract.codelines.build 添加到我的app / controllers / contracts_controller.rb的新操作中,现在units_alloc显示在我的视图中,我可以设置它。但是现在我的代码行表中有两行。一个由 @ contract.codes.build 产生的,其中构建了代码对象和代码行对象,第二行是 @ contract.codelines.build 的结果我的代码行表如下:

    id       contract_id       code_id       units_alloc
     1             1                1                  .... @contract.codes.build
     2             1                             80.00 .... @contract.codelines.build

我是不是可以通过@ contract.codes.build给出的第一个构建来访问units_alloc,其中代码对象和代码行对象都是构建的?

有人知道我对这个问题的理解是否正确,或者你能否指出我所有人都会被披露的资源?

正如我想到的那样,我通过代码行构建了代码对象,并得到了相同的结果。

感谢您的任何建议。

更新 我可以让我的代码行表只有一条记录,其中所有相关的id设置如下:

我的控制台:

    @contract = Contract.new(authnum: "900700", st_date: "2012-01-01",  end_date:
    "2012-30-06")

    @contract.save

    @code = Code.new(code_name: "S-5463", status: "Active",   description: 
    "This and That")

    @code.save

    @codeline = @code.codelines.build(:units_alloc => "80.00",  :contract => @contract)

    @codeline.save

    @codeline
    => #<Codeline id: 91, contract_id: 64, code_id: 54, units_alloc: 80.00>

使用pgadmin3我检查我的代码行表,我只得到一条记录,即:

    id    contract_id    code_id   units_alloc
    91         64            54       80.00

现在测试是让我的contract_controller new / create动作做同样的事情。

2 个答案:

答案 0 :(得分:0)

对于新的,

现有合同与现有代码。将它们捆绑在一起。

使用这两个ID和units_alloc

创建代码行
codeline.contract = contract
codeline.code = code
codeline.units_alloc = 1

codeline.save

当你想要展示时

使用Codeline.all


如果您有动态创建的新对象列表,例如Array.new

post.comments.build

为我的帖子构建一个新的空注释数组而不是nil

我希望这会有所帮助。我自己是新手。

修改

首次访问该页面时,该应用会尝试创建新的代码行,直到保存为止

@codeline = Codeline.new
@codeline.contract = Contract.new #or find it from the table, depends on the logic
@codeline.code = Code.new
@codeline.units_alloc = 0 #default value

答案 1 :(得分:0)

我在这个网站debugging nested_forms找到了一个解决方案。

这是你读过的第九个项目,如果你正在使用has_many:通过关联,那么你需要将你的nested_form基于连接模型或接近它的东西。

我通过在这里和那里重构一些代码来快速运行测试,现在我有一个可行的嵌套表单,它向控制器提供正确的参数,然后控制器正确地处理它,我的代码行表现在只有一个记录。