Справка по моделированию данных Rails 3 - имеет много вложенных атрибутов

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

  1. Можно добавить нескольких получателей (например, «добавить получателя», «удалить получателя») - вложенные атрибуты
  2. После создания новой награды награда будет размещена в профиле получателя.
  3. Разрешает будущий опрос @ recipient.awards и @ announcer.awards

Действительно бороться с точки зрения того, как грамотно решить эту проблему. Следующая структура данных имеет смысл, однако не может содержать "accept_nested_attributes_for: recipients" в форме награды. Вы можете помочь? Спасибо заранее.

класс Recipient ‹ActiveRecord :: Base

  • has_many: награды
  • has_many: комментаторы,: through =>: награды

конец

class Announcer ‹ActiveRecord :: Base

  • has_many: награды
  • has_many: recipients,: through =>: награды

конец

class Award ‹ActiveRecord :: Base

  • own_to: диктор
  • own_to: получатель

конец


person coder    schedule 18.03.2011    source источник


Ответы (1)


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

class User < ActiveRecord::Base
  has_many :recipients
  has_many :awards, :through => :recipients
end

# this is your relationship between an award and a user
class Recipient < ActiveRecord::Base
  belongs_to :user
  belongs_to :award
end

class Award < ActiveRecord::Base
  has_many :recipients
  has_many :users, :through => :recipients
  belongs_to :announcer

  accepts_nested_attributes_for :recipients, :allow_destroy => true
end

class Announcer < ActiveRecord::Base
  has_many :awards
  has_many :recipients, :through => :awards
end

Затем вы просто создадите вложенную форму, которая построит массив recipients_attributes:

<%= form_for @award do |f| %>

  <%= f.text_field :name %>

  <div id="recipients">
    <% @award.recipients.each do |recipient| %>

     <%= render :partial => '/recipients/new', :locals => {:recipient => recipient, :f => f} %>

    <% end %>
  </div>
  <%= link_to_function 'add recipient', "jQuery('#recipients').append(#{render(:partial => '/recipients/new').to_json})" %>

<% end %>

И, чтобы он оставался СУХИМ, просто вставьте вложенную часть в частичную:

# app/views/recipients/_new.html.erb
<% recipient ||= Recipient.new %>
<%= f.fields_for 'recipients_attributes[]', recipient do |rf| %>
  <%= rf.select :user_id, User.all %>
  <%= fr.check_box '_delete' %>
  <%= fr.label '_delete', 'remove' %>
<% end %>

Очевидно, что вызов User.all не идеален, поэтому, возможно, сделайте это автозаполнением.

person mnelson    schedule 18.03.2011
comment
Майк, большое спасибо за вашу помощь. Будучи подростком, я все еще пытаюсь обернуть это вокруг своей головы. Попробую сегодня вечером ваше решение. Спасибо. Хороших выходных - person coder; 19.03.2011
comment
Вот фрагмент из текущего проекта, чтобы получить еще один пример: пример вложенной формы has_many - person mnelson; 19.03.2011
comment
Привет, Майк, я пытался изменить свой код на основе ваших предложений. Мои модели получателя и диктора связаны с разработкой, после такой игры ... Я только что добавил ваш код, чтобы создать новый, чтобы увидеть, как он работает, однако получил это сообщение об ошибке undefined local variable или method `f 'for # 2 строка в частичном файле ‹% = f.fields_for 'recipients_attributes []', получатель do | rf | % ›. Не знаю, как действовать сейчас, пожалуйста, помогите. Спасибо - person coder; 22.03.2011
comment
Передайте содержащую форму частичному: ‹% = render: partial =› '/ recipients / new',: locals = ›{: recipient =› recipient,: f = ›form}%› - обновление ответа - person mnelson; 22.03.2011
comment
Разве диктор не является самим пользователем? зачем добавлять новую модель для диктора? Нельзя ли его разместить в самой таблице User? - person FaaduBaalak; 24.08.2019