2015-08-25 90 views
0

我有兩個模型,Event和Vip,每個都與HABTM關係相關。 我與VIP_ID列的events_vips表,EVENT_ID如何填充我爲has_and_belongs_to_many關聯創建的連接表?

我的新活動形式:

<%= form_for [@organization, @event] do |f| %> 
    <p> 
     <%= f.label :when %> 
     <%= f.date_select :when %> 
    </p> 
    <p> 
     <%= f.label :name %> 
     <%= f.text_field :name %> 
    </p> 
    <p> 
     <%= f.label :vip %> 
     <%= f.select :vip_id, options_for_select(@organization.vips.all.map {|v| [v.name, v.id]}) %> 
    </p> 
    <p> 
     <%= f.submit %> 
    </p> 
<% end %> 

我的活動控制器:

def new 
     @organization = Organization.find(params[:organization_id]) 
     @event = @organization.events.new 
    end 

    def create 
     @organization = Organization.find(params[:organization_id]) 
     @event = @organization.events.build(event_params) 

     if @event.save 
      redirect_to organization_path(@organization) 
     else 
      render 'new' 
     end 
    end 

我希望我的events_vips表得到填充了當我創建一個活動時新的事件/ VIP關係。或者那是錯誤的方式呢?

編輯:

我的模式是這樣的:

class Vip < ActiveRecord::Base 
    belongs_to :organization 
    has_and_belongs_to_many :events 
end 

class Event < ActiveRecord::Base 
    belongs_to :organization 
    has_and_belongs_to_many :vips 
end 
+0

你是否在模型中聲明瞭你的關聯? – ChiefRockaChris

+0

是的,我相信我有。我編輯了我的帖子以顯示我的模型 –

回答

0

我會用has_many :events, :through => :some_table_namehas_many :organizations, :through => :some_table_name,而不是一個的habtm。其原因是,隨着這種惡習,你在幾個方面受到限制。首先,由於habtm構造的字母性質,並且使用has_many,因此連接表名稱僅限於events_organizations:通過您可以使用任意表名來描述。

更重要的是,您不能在habtm連接表中存儲關於關係的任何其他信息。在has_many中:例如,您可以存儲表格編號,到達時間,碼頭調度或適用於特定組織的特定事件在其所屬的連接表中的其他信息。這樣,連接表不僅存儲關係,還存儲有關關係性質的信息。

在這兩種情況下,您的問題的答案是在模型中使用accepts_nested_attributes_for :your_join_table_model,您將操縱數據(可能是兩者)。

Here is part 1 of a railscast dedicated to the subject.

Here is a link to the HABTM checkboxes railscast, if you wanted to go that route.

0

你需要找到您的PARAMS貴賓和它的event#vips

def create 
    @organization = Organization.find(params[:organization_id]) 
    @event = @organization.events.build(event_params) 

    if @event.save 
     vip = Vip.find(event_params[:vip_id]) 
     @event.vips << vip # this will create the association 
     redirect_to organization_path(@organization) 
    else 
     render 'new' 
    end 
end 

現在它總是一個好主意,添加驗證檢查,例如確保一個VIP PARAM進來的形式,但上面的是如何真正建立關聯。一旦事件被保存,其VIP關聯可以被創建。

相關問題