Как взаимодействует has_many: through и атрибут модели соединения? - PullRequest
0 голосов
/ 26 марта 2012

У меня действительно возникают проблемы с настройкой атрибута в моей модели соединения?

Мои модели:

  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 действие, чтобы сделать то же самое.

Ответы [ 2 ]

0 голосов
/ 07 апреля 2012

Я нашел решение на этом сайте, отладка nested_forms .

Это девятый пункт, где вы читаете, что если вы работаете с has_many: посредством ассоциации, то вам нужно основывать nested_form на модели соединения или чем-то близком к этому.

Я быстро выполнил тест путем рефакторинга некоторого кода тут и там, и теперь у меня есть работоспособная вложенная форма, которая передает правильные параметры контроллеру, который, в свою очередь, обрабатывает его правильно, и моя таблица кодовых строк теперь имеет только одну запись.

0 голосов
/ 27 марта 2012

Для нового,

Существующий контракт с существующим кодом.Свяжите их вместе.

Создайте кодовую строку, используя эти два идентификатора и unit_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
...