我有兩張表,User
和Allergy
。這些通過另一個表連接,UserAllergy
。如所預期的機型:Rails 4中的奇怪has_many關聯行爲
class User
has_many :user_allergies
has_many :allergies, through: :user_allergies
end
class UserAllergy
belongs_to :user
belongs_to :allergy
end
class Allergy
has_many :user_allergies
has_many :users, through :user_allergies
end
我感到困惑的是從創造過敏什麼是多值collection_select
在我User
形式。
我有以下字段:
<%= f.collection_select :allergy_ids,
Allergy.all,
:id,
:name,
{},
{ class: 'form-control', multiple: true }
%>
此,如果我與ID 1和ID 2中選擇的正確地插入鑰匙插入我的PARAMS像這樣:
{ user: { id: "1", allergy_ids: ["", "1", "2"] } }
當我創建用戶用@user = User.new(my_params)
實例化,會出現奇怪的行爲。相反,將提供allergy_ids
到連接表,Rails會查詢以獲得該用戶的所有當前user_allergies
,然後刪除所有當前user_allergies
的:
Started PATCH "/employees/regular_user" for 127.0.0.1 at 2015-06-18 22:08:30 -0400
Processing by UsersController#update as HTML
Parameters: {"utf8"=>"✓", "user"=>{ "allergy_ids"=>["", "1", "2", "3"]}, "button"=>"", "id"=>"regular_user"}
CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 2]]
(0.1ms) begin transaction
Allergy Load (0.1ms) SELECT "allergies".* FROM "allergies" INNER JOIN "user_allergies" ON "allergies"."id" = "user_allergies"."allergy_id" WHERE "user_allergies"."user_id" = ? [["user_id", 1]]
SQL (0.1ms) DELETE FROM "user_allergies" WHERE "user_allergies"."user_id" = ? AND "user_allergies"."allergy_id" = 1 [["user_id", 1]]
(27.4ms) commit transaction
Redirected to http://localhost:3000/employees/regular_user
Completed 302 Found in 32ms (ActiveRecord: 27.8ms)
任何人都知道是什麼給了,或者我需要做的隱含地製造過敏症?我試過accepts_nested_attributes_for
,並更改表格以使用fields_for
。
我已經在類似情況下做到了這一點(在學校設置學生分配到班),是的,分配是大規模更換之類的名單。在你上面的例子中,它刪除了現有的UserAllergies,它是否也添加了新的?或者用戶沒有使用UserAllergies? –
它只刪除舊的,留下一個沒有過敏的用戶。 –