Справка по моделированию данных Rails 3 - имеет много, принадлежит, вложенных атрибутов - PullRequest
2 голосов
/ 18 марта 2011

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

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

Действительно борись с точки зрения того, как грамотно решить эту проблему. Приведенная ниже структура данных имеет смысл, однако не может использовать «accepts_nested_attributes_for: members» в форме вознаграждения. Вы можете помочь? Большое спасибо заранее.

Получатель класса

  • has_many: награды
  • has_many: объявители,: through =>: награды

конец

извещатель класса

  • has_many: награды
  • has_many: получатели,: через =>: награды

конец

награда класса

  • принадлежит_: диктор
  • принадлежит_ получателю

конец

1 Ответ

3 голосов
/ 19 марта 2011

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

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

Тогда вы просто создадите вложенную форму, которая создаст массив receients_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 не идеален, поэтому, возможно, сделайте это автозаполнением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...