再次来到rails的新手。
其实我在这里问了一个类似的问题:Having trouble in updating join model extra attributes in has_many through association - Rails,但我认为我的方向错误,方法复杂,所以想开一个更简单,更精确的问题。方式。
想知道我在has_many through:
的连接模型中有多余属性,保存和更新连接模型的额外属性的标准方法是什么。以下只是一个例子,我尝试过:
在Forum
中,A User
有许多Group
; 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
;但是,在关联中执行forum_id
时,update
将为零。它已经让我接近了二十多个小时,我真的想知道保存和更新连接模型的额外属性的标准方法。
感谢您阅读我的话。感谢任何评论。每一个建议都会减轻我现在的头痛。感谢。
更新时间:上午10点17分+ 8月7日
我尝试了accepted_nested_attributes_for
解决方案但没有运气,我仍然可以在forum_id
中插入save
,但仍未在forum_id
中插入update
,更新的记录将获得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
和{{1}创建第一个论坛})
更新时间:12:53 pm + 8,8 / 12/2016
尝试使用f.save
代替save
,但它根本没有更新,提交更新表单后记录将相同。
尝试使用update(params)
和puts params.inspect
,其结果如下:
PARAMS
puts group_params.inspect
“✓”,“_ method”=&gt;“put”,“authenticity_token”=&gt;“s8l + wWzTci7hD1AoyLN9sIjFu296ooU0VwWgCFIP4yvJaR7I3HS9E3ja4VXcFQv1QadyeJspef3dBD1XzVaF + Q ==”,“group”=&gt; {“name”=&gt;“fff”, “user_ids”=&gt; [“”,“1”,“2”,“3”]},“commit”=&gt;“提交”,“控制器”=&gt;“组”,“操作”=&gt; “更新”,“id”=&gt;“8”}允许:false&gt;
group_params
Parameters: {"utf8"=>"✓", "authenticity_token"=>"s8l+wWzTci7hD1AoyLN9sIjFu296ooU0VwWgCFIP4yvJaR7I3HS9E3ja4VXcFQv1QadyeJspef3dBD1XzVaF+Q==", "group"=>{"name"=>"fff", "user_ids"=>["", "1", "2", "3"]}, "commit"=>"Submit", "id"=>"8"}
答案 0 :(得分:0)
我只是在这里猜测,但我认为你必须添加
accepts_nested_attributes_for :group_users
在您的群组模型上。此外,相信您必须将permited params添加到您的控制器。类似的东西:
params.require(:group).permit(:name, user_ids: [], group_users_attributes: [:id, :attribute1, :attribute2, :_destroy])
这就是我怎么做的。在这种情况下,只有在使用cocoon gem时才需要:_destroy
属性。将attribute1,attribute2替换为您想要更新的属性。在这种情况下,我认为它只是forum_id
。
希望这对你有所帮助...