2015-06-19 26 views
0

我有兩張表,UserAllergy。這些通過另一個表連接,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

+0

我已經在類似情況下做到了這一點(在學校設置學生分配到班),是的,分配是大規模更換之類的名單。在你上面的例子中,它刪除了現有的UserAllergies,它是否也添加了新的?或者用戶沒有使用UserAllergies? –

+0

它只刪除舊的,留下一個沒有過敏的用戶。 –

回答

1

所以,我去看看我的代碼做了類似的功能。這是我的創建方法的樣子。這是創建一個學生在學校設置的學生團體的任務(我沒有使用「班」,因爲Ruby不喜歡這樣)。

def create 
    @student = Student.new(student_params) 

    if @student.save 
    @student.student_groups = StudentGroup.where(id: params[:student][:student_group_ids]) 
    flash[:success] = "Student was successfully created." 
    redirect_to @student 
    else 
    render 'new', notice: "Your student could not be created." 
    end 
end 

我創建student_params時完全忽略了學生組ID,因爲我不使用他們的質量分配。

是的,一行額外的代碼。我真的很想知道是否有辦法通過批量分配完成此任務。

+0

我只是用這種方法來完成這項任務,因爲我厭倦了試圖讓大規模分配工作。 如果有其他人的回答是更多的Rails的魔力,那麼我會很樂意接受他們的答案是正確的。 –

0

你錯過了從過敏到用戶的關係中的一部分難題。

class Allergy 
    has_many :user_allergies 
    has_many :users, through: :user_allergies 
end 
+0

是的,我試圖添加關聯以確保它不是這樣,並且它不能解決這個問題。 –

0

只要給下面的代碼試戴

params.require(:user).permit(___, ____, {allergy_ids: []}, ____, ____)