這裏再次談到rails的新手。更新加入模型的額外屬性的標準方法 - Rails
其實我在這問了一個類似的問題:Having trouble in updating join model extra attributes in has_many through association - Rails,但是以爲我問了一個錯誤的方向和複雜的方式,所以想打開一個新的問題,以更簡單更精確的方式提問。
想知道何時在has_many through:
,的加入模型中有一個額外的屬性保存和更新加入模型的額外屬性的標準方式是什麼。以下只是一個例子,我曾試過:
在Forum
,A User
有很多Group
; A Group
有許多User
,通過GroupUser
。
class User < ApplicationRecord
has_many :group_users
has_many :groups, through: :group_users
end
class Group < ApplicationRecord
belongs_to :forum
has_many :group_users
has_many :users, through: :group_users
end
class GroupUser < ApplicationRecord
belongs_to :group
belongs_to :user
end
class Forum < ApplicationRecord
has_many :groups
end
由於一些原因,我可能需要一個額外的屬性forum_id
添加到加盟模式GroupUser
所以它變得像:
什麼是做create
的正確方法和update
在控制器?
我已經試過類似:
def create
@forum = Forum.find(params[:forum_id])
@group = @forum.groups.build(group_params)
@group.group_users.each do |join|
join.forum_id = @group.forum_id
end
@group.save
end
def update
@group = Group.find(params[:id])
@group.group_users.each do |join|
join.forum_id = @group.forum_id
end
@group.update(group_params)
end
private
def group_params
params.require(:group).permit(:name, user_ids: [])
end
我可以保存forum_id
在create
;但是,在關聯中執行update
時,forum_id
將爲零。它已經爲我連接了超過20個小時,我真的想知道標準的方式來保存和更新加入模型的額外屬性。
感謝您閱讀我的話。欣賞任何評論。現在每一個建議都會緩解我的頭痛。謝謝。
更新上午10:17 +8 12月7日
我曾嘗試accepted_nested_attributes_for
的解決方案,沒有運氣,我還是可以插入save
的forum_id
,但在update
仍然不插入forum_id
,該更新將得到forum_id: nil
變化的記錄如下:
型號:
class Group < ApplicationRecord
belongs_to :forum
has_many :group_users, inverse_of: :group
has_many :users, through: :group_users
accepts_nested_attributes_for :group_users
end
控制器:
def group_params
params.require(:group).permit(:name, user_ids: [], group_users_attributes: [:id, :forum_id])
end
其實我已經創建了一個項目,你可以在這裏下載:https://github.com/kan1011/rails-101-demo(如果你想運行它,你需要創建在軌道c中的第一個論壇由f = Forum.new
和f.save
)
更新下午12時53 +8,2016年8月12日
已嘗試使用save
而不是update(params)
,但它完全沒有更新,在提交更新表單後記錄將保持不變。
曾嘗試使用puts params.inspect
和puts group_params.inspect
,並談到了以下工作:
PARAMS
Parameters: {"utf8"=>"✓", "authenticity_token"=>"s8l+wWzTci7hD1AoyLN9sIjFu296ooU0VwWgCFIP4yvJaR7I3HS9E3ja4VXcFQv1QadyeJspef3dBD1XzVaF+Q==", "group"=>{"name"=>"fff", "user_ids"=>["", "1", "2", "3"]}, "commit"=>"Submit", "id"=>"8"}
「✓」, 「_method」=> 「放」, 「authenticity_token」= >「s8l + wWzTci7hD1AoyLN9sIjFu296ooU0VwWgCFIP4yvJaR7I3HS9E3ja4VXcFQv1QadyeJspef3dBD1XzVaF + Q ==」,「group」=> {「name」=>「fff」,「user_ids」=> [「」,「1」,「2」,「3」]},「提交「,」控制器「=>」組「,」動作「=>」更新「,」ID「=>」8「}允許:假>
個group_params
<ActionController::Parameters {"name"=>"fff", "user_ids"=>["", "1", "2", "3"]} permitted: true>
感謝您的建議。已經試過並更新過這個問題,但沒有運氣...,我認爲臨界點可能是#save和#update(params)的區別。你有沒有想過這個?十分感謝。 –
好吧,你有沒有嘗試過保存而不是更新? save命令也可用於更新... –
另外,嘗試在更新操作上調試什麼來自group_params(logger.debug group_params.to_h)。我相信forum_id即將成爲零。另外,調試所有參數,如logger.debug params.to_unsafe_h(這樣它會顯示所有參數,忽略強參數),所以如果問題出現在傳遞給參數的參數上,或者值不是來自於形式... –