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, но оно не работает!
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 должен сопровождаться запятой и экземпляром этого класса.
Разве в вашей таблице events_users нет поля 'id' в качестве первичного ключа? Может помочь, если вы разместили макет таблицы для таблицы присоединения events_users.