Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 当更新父对象时,Active record update_属性对对象(父对象)的关联对象(子对象)执行删除查询_Ruby On Rails 3_Activerecord - Fatal编程技术网

Ruby on rails 3 当更新父对象时,Active record update_属性对对象(父对象)的关联对象(子对象)执行删除查询

Ruby on rails 3 当更新父对象时,Active record update_属性对对象(父对象)的关联对象(子对象)执行删除查询,ruby-on-rails-3,activerecord,Ruby On Rails 3,Activerecord,Rails:3.0.11 红宝石:1.9.3 为什么当我更新父对象时,active record update_属性会对对象(父对象)的关联对象(子对象)执行删除查询 以下是我的课程: class User < ActiveRecord::Base has_many :user_keywords, :dependent => :destroy has_many :keywords, :through => :user_keywords end class Us

Rails:3.0.11

红宝石:1.9.3

为什么当我更新父对象时,active record update_属性会对对象(父对象)的关联对象(子对象)执行删除查询

以下是我的课程:

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
上的:dependent选项有许多方法说():

4.3.2.6:依赖 如果将:dependent选项设置为:destroy,则删除此对象将调用关联对象上的destroy方法来删除这些对象。如果将:dependent选项设置为:delete_all,则删除此对象将删除关联的对象,而不调用其destroy方法。如果将:dependent选项设置为:NULL,则删除此对象会将关联对象中的外键设置为NULL

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


我无法理解这种行为。有人能详细说明或澄清一下吗?

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

如果您只想添加关系,而不想删除关系,那么我不建议使用复选框,因为选中复选框意味着添加,但删除复选框意味着破坏关系(在本例中,rails就是这样做的)。带有AJAX功能的按钮可能更有意义。如果您确实希望保留复选框,但不允许rails破坏未选中的关系,那么您必须根据参数自己构建关系,而不是依赖rails魔术来完成这项工作


请注意,这与
:dependent
选项无关,这仅仅是因为您在模型和表单中建立了关系。

感谢Justin的详细阐述。您能给我指一下说明上述复选框行为的文档/资源吗?请看这里:具体地说:
可以通过API管理联接模型的集合。例如,如果指定了内科医生.patients=患者,则会为新关联的对象创建新的联接模型,如果其中一些对象消失,则会删除它们的行。连接模型的自动删除是直接的,不会触发销毁回调。
通过复选框,您实际上是通过更新属性将关键字列表传递给用户。任何缺少的关键字都会自动删除。最佳做法是确保在您输入表单时根据该关系是否已存在预先填充复选框。这样,您必须显式删除复选框才能删除该关系。如果
User
验证失败,会发生什么情况?它将更新数据库中的
user\u关键字
,但不会保存用户记录,从而导致状态不一致。对此有何想法?@Jignesh您可以找到更全面的介绍。
  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')