gpt4 book ai didi

ruby-on-rails-3 - 更新父对象时,事件记录 update_attribute 对对象(父对象)的关联对象(子对象)执行 DELETE 查询

转载 作者:行者123 更新时间:2023-12-04 05:43:18 25 4
gpt4 key购买 nike

导轨:3.0.11

ruby :1.9.3

当我更新父对象时,为什么事件记录 update_attribute 对对象(父对象)的关联对象(子对象)执行 DELETE 查询?

以下是我的类(class):

class User < ActiveRecord::Base

has_many :user_keywords, :dependent => :destroy
has_many :keywords, :through => :user_keywords

end

class UserKeyword < ActiveRecord::Base
belongs_to :user
belongs_to :keyword
end

class Keyword < ActiveRecord::Base
has_many :user_keywords
has_many :users, :through => :user_keywords
end

在前端,每​​个关键字都有一个复选框。

  • 复选框:关键字 1
  • 复选框:关键字 2
  • 复选框:关键字 3
  • 复选框:关键字 4

我第一次选中“关键字 1”和“关键字 2”复选框来更新用户的关键字。

我再次编辑用户以通过选中“关键字 1”和“关键字 3”复选框更新关联的关键字并更新用户。第二次更新删除了我的 USER_KEYWORDS 表中以前的记录。

以下是我的控制台输出,显示正在执行的 DELETE 语句:

  User Load (55.5ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 5 LIMIT 1
Keyword Load (0.2ms) SELECT "keywords".* FROM "keywords" WHERE "keywords"."id" IN (1, 3)
Keyword Load (0.2ms) SELECT "keywords".* FROM "keywords" INNER JOIN "user_keywords" ON "keywords".id = "user_keywords".keyword_id WHERE (("user_keywords".user_id = 5))
AREL (0.2ms) DELETE FROM "user_keywords" WHERE "user_keywords"."user_id" = 5 AND "user_keywords"."keyword_id" = 2
AREL (0.1ms) INSERT INTO "user_keywords" ("keyword_id", "user_id", "status", "created_at", "updated_at") VALUES (3, 5, 'f', '2012-06-12 13:15:43.912236', '2012-06-12 13:15:43.912236')

has_many 方法的 :dependent 选项表示(http://guides.rubyonrails.org/association_basics.html#has_many-association-reference):

4.3.2.6 :依赖

如果将 :dependent 选项设置为 :destroy,则删除该对象将调用关联对象的 destroy 方法来删​​除这些对象。如果将 :dependent 选项设置为 :delete_all,则删除该对象将删除关联的对象,而无需调用它们的 destroy 方法。如果将 :dependent 选项设置为 :nullify,则删除该对象会将关联对象中的外键设置为 NULL。

当您在关联上使用 :through 选项时,此选项将被忽略。 ##

我无法理解这种行为。有人可以对此进行详细说明或澄清吗?

最佳答案

delete 语句只删除了关键字 2 的关联。当您提交了选中两个复选框的表单时,系统假定您希望将这两个项目关联起来,但没有选中其他项目。因此,当它加载当前的 user_keyword 关联时,它看到有一条您没有选择保留的现有记录,因此将其删除。然后它看到有一个新的,所以它创建了一个新的。

如果你只想添加关系,而不是删除关系,那么我不推荐复选框,因为选中复选框意味着添加,但删除复选框意味着破坏关系(这就是 Rails 在这种情况下所做的)。具有 AJAX 功能的按钮可能更有意义。如果您确实想保留复选框,但不允许 Rails 破坏未选中的关系,那么您必须根据参数自己构建关系,而不是依靠 Rails 魔法来为您完成这项工作。

请注意,这与 :dependent 选项无关,这只是由于您在模型和表单中设置的关系。

关于ruby-on-rails-3 - 更新父对象时,事件记录 update_attribute 对对象(父对象)的关联对象(子对象)执行 DELETE 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10997990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com