Rails, используя has_many through и fields_for

У меня есть небольшие проблемы с тем, чтобы заставить это работать.

class User < ActiveRecord::Base
  has_many :events, :through => :event_users
  has_many :event_users
  accepts_nested_attributes_for :event_users, :allow_destroy => true, :reject_if => proc { |obj| obj.blank? }
end

class Event < ActiveRecord::Base
  has_many :event_users
  has_many :users, :through => :event_users
  accepts_nested_attributes_for :users, :reject_if => lambda { |a| a[:nick].blank? }, :allow_destroy => true
end

class EventUser < ActiveRecord::Base
  set_table_name :events_users
  belongs_to :event
  belongs_to :user
end

Таблица-макет:

events_users
  user_id
  event_id
  is_participating

events
  id
  name

users
  id
  name

Это код формы

<%= form_for @event do |f| %>
  <%= f.fields_for :users, f.object.users do |builder| %>
    <%= builder.text_field :name, "Name" %>
    <%= f.fields_for :event_users do |builder2| %>
      <%= builder2.hidden_field :is_participating, :value => true %>
    <% end %>
  <% end %>
<% end %>

Я пытаюсь установить поле is_participating в таблице events_users, но это не работает!


person jonepatr    schedule 11.01.2011    source источник


Ответы (2)


У меня была такая же проблема, и, по сути, я сделал следующее:

<%= form_for @event do |f| %>
   <%= f.fields_for :event_users, @event_user do |builder| %>
      <%= builder.hidden_field :is_participating, :value => true %>
      <%= f.fields_for :users, f.object.user do |builder2| %>
         <%= builder2.text_field :name, "Name" %>
      <% end %>
   <% end %>
<% end %>

т. е. я поменял порядок вложенных объектов. Для этого требуется, чтобы у вас были отношения через объявленную таблицу соединений (что вы и делаете). Он сохранил для меня все атрибуты трех таблиц.

Однако, если вы хотите сохранить свою текущую модель, мне интересно, не следует ли вам настроить вложенную форму 2-го уровня так же, как и первую. А именно, за вашим f.fields_for :event_users должна следовать запятая и экземпляр этого класса.

person jbodily    schedule 02.11.2012

В вашей таблице events_users нет поля «id» в качестве первичного ключа? Может помочь, если вы опубликуете макет таблицы для своей таблицы соединений events_users.

person Steven Soroka    schedule 11.01.2011
comment
Вам нужно поле первичного ключа с именем id для вашей таблицы events_users. Это проблема. - person Steven Soroka; 12.01.2011
comment
Ну, это не решило проблему с не установленным is_participating. Он устанавливается, если я сохраняю форму с новым пользователем, а затем снова обновляю, но если я добавлю нового пользователя во второй раз, он не установит его для нового пользователя... есть идеи? - person jonepatr; 12.01.2011
comment
не должен accepts_nested_attributes_for :event_users быть в модели EventUser, а не в модели User? - person Steven Soroka; 13.01.2011