Создание вложенных атрибутов из флажков формы в модели обратного вызова? - PullRequest
0 голосов
/ 19 января 2011

Я создаю простой образец трекера для небольшой аналитической лаборатории, и я ломаю голову над проблемой. Структурно база данных состоит из пользователей, партий, образцов, инструментов и анализов. Извините, пожалуйста, грязный или плохой код, я новичок в Rails и программировании. Вообще я знаю, где я неаккуратный и как это исправить, это просто вопрос, что я решил проблему. Вот некоторый сокращенный код:


class Batch  

  belongs_to :user
  has_many :samples
  has_many :submissions
  has_many :assays, :through => :submissions

  accepts_nested_attributes_for :samples
  accepts_nested_attributes_for :submissions

end

class Assay  

  belongs_to :instrument
  has_many :submissions
  has_many :batches, :through => :submissions

end

class Submission  

  belongs_to :batches
  belongs_to :assays

end

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


= semantic_form_for @batch do |f|

  - @instruments.each do |instrument|
    %ol
      %li 
        = instrument.instrument_name
        %ol
          - instrument.assays.each do |assay|
            %li
              = assay.assay_name
              # Some magic check boxes that fix my problem. 

    = f.inputs :name => "Batch Info" do 
      = f.input :sampling_date, :required => false 
      = f.input :experiment_name, :required => false 
      = f.input :notes, :as => :text 

    = f.semantic_fields_for :samples do |sample_form|
      = sample_form.input :sample_name
    = f.buttons do 
      = f.commit_button :label => "Submit batch"

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

Моя проблема заключается в том, чтобы решить, когда и как создавать представления в контроллере / модели и как их заполнять. Похоже, мне следует создать какой-то параметр, содержащий assay_ids, и использовать какой-то тип обратного вызова модели (before_create или before_save), который создает params[assay_ids].length число фиктивных представлений, которые я могу заполнить параметрами assay_id. К сожалению, все мои попытки создать метод, который делает это, были тщетными.

Я смотрел все подходящие Railscasts, которые я мог найти, читал записи API, и я слишком долго занимался этим. Я чувствую ответ на самом кончике своего мозга, и я отчаянно нуждаюсь в Ага! момент. Спасибо за любую помощь, вы можете предоставить!

1 Ответ

0 голосов
/ 20 января 2011

Примечание: этот метод очень хрупкий! Я разработал решение, позволяющее сделать пакеты истинным вложенным атрибутом, и я напишу его как можно скорее.

Так что после дня обдумывания ответ всплыл в моей голове (клянусь, я использую Переполнение стека, чтобы официально запустить 12-часовой таймер, когда я эпифанически выясню, что я ошибся). Вот как я это сделал:

По сути, я пытался сделать столько заявок, сколько мне было нужно, поэтому я не стал собирать пустые базы данных, но я также хотел, чтобы они создавались на лету в форме. Поскольку я не хотел вкладывать в мой взгляд кучу дополнительной логики, я установил свой магический флажок как check_box_tag "assay_ids[]", assay.id, чтобы сделать хороший параметр, отдельный от параметра пакетов. Затем в моем контроллере пакетов под create я создал небольшой вспомогательный метод:

def build_submissions(params)
  @submitted_assays = params[:assay_ids]
  for submitted_assay in @submitted_assays do
    @batch.submissions.build(:assay_id => submitted_assay)
  end
end

Это создает столько заявок, сколько мне нужно. Это исправление работает замечательно, но я бы приветствовал любые предложения о том, как решить проблему по-другому.

...