У меня действительно возникают проблемы с настройкой атрибута в моей модели соединения?
Мои модели:
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
Новое действие моего приложения / контроллеров /contract_controller.rb
def new
@contract = Contract.new
@contract.codes.build
end
частичное для моего представления в app / views / contract / _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 Guides и просмотра railscasts # 196 и # 197и исследуя вложенные атрибуты в интернете, я понял, что строка @contract.codes.build в новом действии моего app / controllers / contract_controller.rb не только создала объект кода, но и что он такжепостроил объект кодовых линий.Если я оставлю свое новое действие в моем app / controllers / contract_controller.rb, как указано выше, это именно то, что произойдет.Моя таблица кодовых строк заполняется следующим образом:
id contract_id code_id units_alloc
1 1 1 .... @contract.codes.build
Но если вы посмотрите на мой взгляд, я бы на самом деле хотел бы задать unit_alloc, и эта строка @contract.codes.build не дает мнедоступ к unit_alloc, поскольку он находится в модели кодовой линии.Я добавил @contract.codelines.build к новому действию моего app / controllers / contract_controller.rb, и теперь в моем представлении отображается unit_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
Должен ли я иметь возможность получить доступ к units_alloc через первую сборку, заданную @ contract.codes.build, в которой построен как объект кода, так и объект кодовой строки?
Кто-нибудь знает, правильно ли я понимаю эту проблему, или вы могли бы указать мне на ресурс, где все будет раскрыто?
Точно так же, как после того, как я думал, я построил объект кода с помощью строк кодаи я получил тот же результат.
Спасибо за любые предложения.
Обновление Я могу получить в своей таблице кодовых строк только одну запись со всеми установленными идентификаторами, установленными следующим образом:
Моя консоль:
@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
Теперь тест должен получитьмой противcts_controller new / create действие, чтобы сделать то же самое.