ruby-on-rails - 使用 `assign_attributes` 立即保存 `has_many through:` 关联

标签 ruby-on-rails activerecord ruby-on-rails-5 activemodel

据我所知,assign_attributes (与 update_attributes 不同)不应该保存记录或就此而言,任何记录。

因此,当我发现在提供 _ids 时事实并非如此时,我感到非常震惊。对于 has_many through:关系。

考虑以下示例:

class GroupUser < ApplicationRecord
  belongs_to :group
  belongs_to :user
end

class Group < ApplicationRecord
  has_many :group_users
  has_many :users, through: :group_users
end

class User < ApplicationRecord
  has_many :group_users
  has_many :groups, through: :group_users

  validates :username, presence: true
end

所以我们有用户和组处于 m 对 m 关系。
Group.create # Create group with ID 1
Group.create # Create group with ID 2

u = User.create(username: 'Johny')

# The following line inserts two `GroupUser` join objects, despite the fact 
# that we have called `assign_attributes` instead of `update_attributes` 
# and, equally disturbing, the user object is not even valid as we've 
# supplied an empty `username` attribute.
u.assign_attributes(username: '', group_ids: [1, 26])

评论者要求的日志:
irb(main):013:0> u.assign_attributes(username: '', group_ids: [1, 2])
  Group Load (0.2ms)  SELECT "groups".* FROM "groups" WHERE "groups"."id" IN (1, 2)
  Group Load (0.1ms)  SELECT "groups".* FROM "groups" INNER JOIN "group_users" ON "groups"."id" = "group_users"."group_id" WHERE "group_users"."user_id" = ?  [["user_id", 1]]
   (0.0ms)  begin transaction
  SQL (0.3ms)  INSERT INTO "group_users" ("group_id", "user_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["group_id", 1], ["user_id", 1], ["created_at", "2017-06-29 08:15:11.691941"], ["updated_at", "2017-06-29 08:15:11.691941"]]
  SQL (0.1ms)  INSERT INTO "group_users" ("group_id", "user_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["group_id", 2], ["user_id", 1], ["created_at", "2017-06-29 08:15:11.693984"], ["updated_at", "2017-06-29 08:15:11.693984"]]
   (2.5ms)  commit transaction
=> nil

我敢说 update_attributes_ids构造主要用于处理 Web 表单 - 在这种情况下,一种更新用户本身及其组关联的表单。所以我认为可以肯定地说,这里的一般假设是全有或全无,而不是部分保存。

我以某种方式使用它吗?

最佳答案

@gokul-m 建议在 https://github.com/rails/rails/issues/17368 阅读有关该问题的信息.那里的评论之一指出了一个临时的解决方法:https://gist.github.com/remofritzsche/4204e399e547ff7e3afdd0d89a5aaf3e

关于ruby-on-rails - 使用 `assign_attributes` 立即保存 `has_many through:` 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44819384/

相关文章:

Heroku 部署后 CSS 未更​​新

ruby-on-rails - 测试葡萄 api。 ActionController::TestCase @controller 为 nil

ruby-on-rails - Ruby 控制台参数

ruby-on-rails - Rails 3 Distinct 加入 Postgresql

ruby-on-rails - rails 5 : Load lib files in production

ruby-on-rails - quill js羊皮纸错误

ruby-on-rails - Rails 浏览器检测方法

ruby-on-rails - 从 ActiveRecord 模型获取 ID 列表的最佳实践

mysql - Rails + Postgres 与自定义外键的关系问题

ruby-on-rails - Pundit::NotDefinedError:无法找到策略 `UserPolicy`