【问题标题】:The standard way to update extra attribute of join model - Rails更新连接模型额外属性的标准方法 - Rails
【发布时间】:2017-04-21 05:47:22
【问题描述】:

Rails 新手又来了。

其实我在这个Having trouble in updating join model extra attributes in has_many through association - Rails中也问过类似的问题,但是觉得我问的方向错了,方式复杂,所以想开一个新的问题,问的更简单更准确。

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

在一个Forum中,一个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

由于某种原因,我可能想在连接模型GroupUser中添加一个额外的属性forum_id所以它变成了:

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中;但是,在关联中执行 update 时,forum_id 将为零。它已经和我接壤了二十多个小时,我真的很想知道保存和更新连接模型的额外属性的标准方法

感谢您阅读我的文字。欣赏任何cmets。每一个建议都会减轻我现在的头痛。谢谢。


12 月 7 日上午 10:17 +8 更新

我尝试了accepted_nested_attributes_for 解决方案,但没有成功,我仍然可以在save 中插入forum_id,但仍然无法在update 中插入forum_id,更新的记录将获得@987654346 @

变化如下:

型号:

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(如果你想运行它,你需要在rails c中创建第一个论坛,f = Forum.newf.save


2016 年 8 月 12 日下午 12:53 +8 点更新

尝试使用save代替update(params),但根本没有更新,提交更新表单后记录不变。

尝试使用puts params.inspectputs group_params.inspect,结果如下:

参数

  Parameters: {"utf8"=>"✓", "authenticity_token"=>"s8l+wWzTci7hD1AoyLN9sIjFu296ooU0VwWgCFIP4yvJaR7I3HS9E3ja4VXcFQv1QadyeJspef3dBD1XzVaF+Q==", "group"=>{"name"=>"fff", "user_ids"=>["", "1", "2", "3"]}, "commit"=>"Submit", "id"=>"8"}

"✓", "_method"=>"put", "authenticity_token"=>"s8l+wWzTci7hD1AoyLN9sIjFu296ooU0VwWgCFIP4yvJaR7I3HS9E3ja4VXcFQv1QadyeJspef3dBD1XzVaF+Q==", "group"=>{"name"=>"fff"="user_id >["", "1", "2", "3"]}, "commit"=>"提交", "controller"=>"groups", "action"=>"update", "id"= >“8”} 允许:假>

组参数

<ActionController::Parameters {"name"=>"fff", "user_ids"=>["", "1", "2", "3"]} permitted: true>

【问题讨论】:

    标签: ruby-on-rails ruby join crud


    【解决方案1】:

    我只是在这里猜测,但我认为你必须添加

    accepts_nested_attributes_for :group_users
    

    在您的团队模型上。另外,相信您必须将允许的参数添加到您的控制器中。比如:

    params.require(:group).permit(:name, user_ids: [], group_users_attributes: [:id, :attribute1, :attribute2, :_destroy])
    

    我就是这样做的。在这种情况下,只有在使用 cocoon gem 时才需要 :_destroy 属性。将 attribute1、attribute2 替换为您要更新的那些。在那种情况下,我相信它只是forum_id

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

    【讨论】:

    • 感谢您的建议。已经尝试并更新了问题,但没有运气......,我认为关键点可能是#save和#update(params)的区别。你对此有什么想法吗?非常感谢。
    • 好吧,你有没有尝试调用保存而不是更新? save 命令也可以用于更新...
    • 另外,尝试在更新操作上调试来自 group_params (logger.debug group_params.to_h) 的内容。我相信 forum_id 将归零。此外,调试所有参数,例如 logger.debug params.to_unsafe_h (这样它会显示所有参数,忽略强参数),所以如果问题出在传递给更新的参数上,或者值不是来自,我们可以更好地看到形式...
    • 已尝试#save,但它没有更新记录。对于调试,我已经阅读了一些关于它的文档,但并不真正了解如何使用它。我使用 puts params.inspect 和 puts group_params.inspect 代替,并在问题中更新。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2010-09-29
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多