2

Ich habe ein wenig Mühe, dies zu arbeiten.Schienen mit has_many through und 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 

Tabellenlayout:

events_users 
    user_id 
    event_id 
    is_participating 

events 
    id 
    name 

users 
    id 
    name 

Dies ist der Code für das Formular

ist
<%= 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 %> 

Was ich versuche zu erreichen, um das Feld zu setzen in der events_users Tabelle is_participating, aber es funktioniert nicht!

Antwort

0

Hat Ihre Tabelle events_users kein 'ID'-Feld als Primärschlüssel? Könnte helfen, wenn Sie das Tabellenlayout für Ihre Join-Tabelle "events_users" veröffentlicht haben.

+0

Ich habe es jetzt hinzugefügt! – jonepatr

+0

Sie benötigen ein Primärschlüsselfeld namens "id" für Ihre Tabelle events_users. Das ist das Problem. –

+0

Nun, es hat das Problem nicht gelöst, wenn das is_participating nicht gesetzt wurde. Es wird gesetzt, wenn ich das Formular mit einem neuen Benutzer speichere und dann wieder aktualisiere, aber wenn ich einen neuen Benutzer das zweite Mal hinzufüge, wird es es für den neuen Benutzer nicht einstellen ... irgendeine Idee? – jonepatr

1

Ich hatte das gleiche Problem und im Wesentlichen, was ich tat, war die folgende:

<%= 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 %> 

das heißt ich die Reihenfolge der verschachtelten Objekten geschaltet. Dies erfordert, dass Sie über Ihre Join-Tabelle eine Beziehung deklariert haben (was Sie tun). Es hat mir alle Attribute in den drei Tabellen gespeichert.

Wenn Sie jedoch Ihr aktuelles Modell behalten möchten, frage ich mich, ob Sie nicht die gleiche Konfiguration für die verschachtelte Form auf der zweiten Ebene haben sollten wie die erste. Auf Ihr f.fields_for: event_users sollte nämlich ein Komma und eine Instanz dieser Klasse folgen.

Verwandte Themen