0

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

我的模型:

  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 指南、观看 railscasts #196 和 #197 以及研究互联网上的嵌套属性,我了解到我的 app/controllers/contracts_controller.rb 的新操作中的@contract.codes.build行不仅构建了code 对象,但它还构建了 codelines 对象。如果我像上面一样离开我的 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

现在测试是让我的contracts_controller new/create 操作来做同样的事情。

4

2 回答 2

0

对于新的,

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

使用这两个 id 和 units_alloc 创建一个代码行

codeline.contract = contract
codeline.code = code
codeline.units_alloc = 1

codeline.save

当你想展示

利用Codeline.all


当您有一个要动态创建的对象的新列表时,例如 Array.new

post.comments.build

为我的帖子构建一个新的空评论数组,而不是 nil

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

编辑

第一次访问该页面时,应用程序将尝试创建一个新的代码行,直到它被保存

@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
于 2012-03-26T20:12:16.433 回答
0

我在这个站点找到了一个解决方案,调试 nested_forms

这是您读到的第九个子弹,如果您正在使用 has_many :through 关联,那么您需要将您的nested_form 基于连接模型或类似的东西。

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

于 2012-04-06T22:00:15.517 回答