更新连接模型的额外属性的标准方法 - Rails

时间:2016-12-06 14:37:19

标签: ruby-on-rails ruby join crud

再次来到rails的新手。

其实我在这里问了一个类似的问题:Having trouble in updating join model extra attributes in has_many through association - Rails,但我认为我的方向错误,方法复杂,所以想开一个更简单,更精确的问题。方式。

想知道我在has_many through:的连接模型中有多余属性,保存和更新连接模型的额外属性的标准方法是什么。以下只是一个例子,我尝试过:

Forum中,A User有许多Group; Group有很多UserGroupUser

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,因此它会变成:

UML diagram

在控制器中执行createupdate的正确方法是什么?

我尝试过类似的事情:

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"}

1 个答案:

答案 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

希望这对你有所帮助...