2017-08-04 138 views
0

我有以下型號:可以在沒有連接表的情況下使用accep_nested_attributes_?

class Club < ApplicationRecord 
    has_many :users 
    accepts_nested_attributes_for :users 
end 

class Users < ApplicationRecord 
    belongs_to :club 
end 

我的理解是,我應該能夠做到這一點的用戶添加到俱樂部:

c = Club.first 
p = { :users_attributes => [{:id => 1, :club_id => 2}] } 
c.update(p) 

當我這樣做,我收到以下錯誤:

2.4.1 :003 > c.update(p) 
(0.3ms) BEGIN 
User Load (0.8ms) SELECT "users".* FROM "users" WHERE "users"."club_id" = $1 AND "users"."id" = 1 [["club_id", 2]] 
(0.2ms) ROLLBACK 
ActiveRecord::RecordNotFound: Couldn't find User with ID=1 for Club with ID=2 

Rails的似乎是檢查,如果用戶已經是俱樂部讓我更新用戶之前的成員。

如果我嘗試將已經在俱樂部中的用戶修改爲另一個俱樂部,它將起作用。

我想我可以通過創建一個連接表來解決這個問題,但我寧願不要。幫幫我!

+0

用戶可以是多個俱樂部的成員嗎?或者,用戶當時只是1個俱樂部的成員? – Crashtor

+0

沒有。 users表有一個club_id字段。 –

+0

好吧,然後我看到你正在嘗試做什麼 – Crashtor

回答

0

accept_nested_attributes用於希望通過父模型同時/通過相同表單保存多個對象。我甚至不知道爲什麼你需要在俱樂部擁有has_many :users,因爲沒有用戶是真正從俱樂部建造的。用戶屬於一個俱樂部可以簡單地通過簡單地做反正迭代槽:

clubs/show.html.erb 

<% Users.all.where(:club_id => @club.id).each do |user| %> 

而且你會得到屬於俱樂部成員的所有用戶。

由於您希望在此處執行的操作是更新用戶上的club_id,所以甚至不需要accept_nested_attributes,更不用說創建連接表了。 (除非你希望同時更新它們兩個)。但是從我所看到的情況來看,在這種情況下你需要做的就是創建一個form_for @user,通過@ club.id,像這樣:

假設你在俱樂部的展示頁面或迭代俱樂部對象@ Club.id可以訪問:

<%= simple_form_for(current_user, as: current_user, url: update_user_path(current_user), html: { method: :patch}) do |f| %> 
    <%= hidden_field :club_id, :value => @club.id %> 
    <%= f.button :submit, "Join Club!" %> 
<% end %> 

和voilá。用戶現在擁有所需的club_id。

如果你希望通過控制檯來做到這一點,只是做:

x = User.find(1) 
x.update(club_id: 1) 

如果你想添加/刪除多個用戶,只是做:

x = User.find(1,2,3,4,5,6,7) 
x.update(club_id: 1) 

如果您希望使用不同多個不同的用戶club_ids,你可以這樣做:

x = { 1 => { "club_id" => 1 }, 2 => { "club_id" => 2 } } 
User.update(x.keys, x.values) 

http://api.rubyonrails.org/v3.2.0/classes/ActiveRecord/Relation.html#method-i-update

+0

有幾種方法可以完成我想要的任務,而不用使用accept_nested_attributes_for。但我試圖瞭解如何accept_nested_attributes_for在沒有連接表的情況下工作。 比方說,我想添加1個用戶,並從一個俱樂部中刪除1個用戶使用一個params散列。我認爲這應該可以使用accepts_nested_attributes_for。例如:{:users_attributes => [{:id => 1,:club_id => 2},{:id => 2,:club_id => nil}]} –

+0

但我沒有看到如何應用任何真實世界的程序設計案例都是誠實的,因爲沒有任何用戶對象是從俱樂部創建的......除非您希望同時創建用戶和俱樂部。然後accept_nested_attributes_for將是一個解決方案。雖然不是絕對必要的。還有其他的解決方案,我個人更寧願寧願。 – Crashtor

+0

非常感謝您的幫助,並且您爲問題中提出的假設我添加了解決方案,但它沒有回答在沒有連接表的情況下是否可以使用accept_nested_attributes_for,這是我真正想知道的。我應該如何繼續? –

相關問題