2017-07-15 49 views
0

我有一個模型Group其中has_manyUsersRails:has_many關聯通過表單中的對象ID數組

​​

我使用JS的前端到User ID添加到陣列user_ids。隱藏字段看起來這樣:

= f.hidden_field :user_ids, id: "ids_field" 

選擇幾個用戶,將它們添加到一個JS數組和assiginging隱藏字段的值到t帽子陣,我提出用強PARAMS(與user_ids作爲數組後)從PARAMS創建一個新的對象:

@group = Group.new(group_params) 

def group_params 
    params.require(:group).permit(:name, :user_id, :user_ids=>[]) 
end 

日誌顯示有一個逗號分隔的列表中user_ids提交:

Processing by GroupsController#create as JS 

Parameters: {"utf8"=>"✓", "group"=>{"name"=>"", "user_ids"=>["25,1"]}, "commit"=>"Save Squad"} 

檢查控制檯中的Group顯示只有數組中的第一個ID被分配給該組。

irb(main):128:0> Group.last.user_ids 
.. 
[ 
    [0] 25 
] 

我一直在抨擊我的頭靠在牆上就這個問題在過去兩天,根本無法使它發揮作用。我嘗試了以下變體: - 在前端使用JSON - 刪除後端的序列化 - 使用.split(「,」)分割數組參數 - 使用group_params(包括/不包括「=> []「在user_ids上並將明確的名稱添加到我的隱藏字段中。通常我會在這裏得到一個不允許的參數錯誤。 - 使用Group.users < <將陣列分配到組模型....

任何幫助或方向是非常感謝。我覺得我在某個時候已經掌握了所有的部分,而不是在同一時間。如果我完全關閉,並且有更好的方法來做到這一點,我已經準備好拋棄它並繼續前進。

預先感謝您:)


編輯:更多玩弄已經表明我的user_ids陣列確實是一個數組,但只包含一個條目:「25,1」。我解決了我的問題,採取params[:user_ids][0]並通過逗號分隔符分割,遍歷索引並將每個用戶保存到組關聯。我不認爲這是一個很好的解決方案,仍然希望在沒有操縱的情況下通過直線陣列。

+0

是否有一個原因,你是不是在軌道形式而不是JS使用某種'collection_check_boxes'?這些ID實際上會作爲params散列中的一個數組發送,並且您可以使用內置的方法進行保存等。有一些checkbox的問題,但是您只需要注意數據如何通過。 – Beartech

回答

1

這似乎是經典的「擁有」和「屬於許多」情況,因爲用戶可以「擁有」一個組並且屬於許多組。我會做線沿線的東西:

class Group < ApplicationRecord 
    belongs_to :user 
    has_many :users_groups 
    has_many :users, through: :users_groups 
    accepts_nested_attributes_for :users 
end 

Class User < ApplicationRecord 
    belongs_to :group 
    has_many :users_groups 
    has_many :groups, through: :users_groups 
    accepts_nested_attributes_for :groups 
end 

在終端創建遷移:

軌摹遷移CreateUsersGroupsJoinTable用戶組

這將創建一個列的連接表:

|id|user_ids|group_ids| 

這讓你像Rails的各種方法:

u = User.find(1) 
#returns user with ID 1 

u.groups 
#will a result of joining Group with UsersGroups ON groups.id = users_groups.group_id WHERE users_groups.user_ids = 1 

你可以做反向太:

g = Group.find(1) 

g.users 
#returns all user objects that belong to that group. 

然後,當你正在做的形式它給你的東西一樣collection_check_boxes會自動建立了基於之類的東西羣組。或User.all複選框,並返回數組會自動更新連接表並完成所有這些工作,它看起來就像在JS中所做的那樣。

+0

感謝您的深思。我確實建立了has_many和belongs_to關係。我以前使用collection_check_boxes來創建組,它按預期工作,但我需要通過搜索而不是複選框來創建數組。我讓用戶從網站上的任何用戶創建一個組,並且不能有一千個複選框供他們滾動瀏覽。 – Ladybro

+0

啊,我不知道這是如何建立。但是collection_check_boxes可以讓你使用任何東西作爲集合,也就是說你不必使用'User.all'。你可以讓你的搜索結果通過AJAX查詢,所以'User.where(...)'。或者因爲複選框的重量相當輕,就可以使用'User.all',然後使用JQuery UI搜索來縮小結果。它只是隱藏那些不符合你想要的。而且由於'collection_check_boxes'只提交了複選框,所以在這個複選框中會有一個輕量級的回覆。 – Beartech

+0

我可以給你更多的例子,但我必須知道你是如何做你的搜索來縮小選擇範圍。 – Beartech

相關問題