Ruby ActiveRecord基础:使用<<<<<<<<<<<<可能会更新其属性?

时间:2013-12-06 13:04:38

标签: ruby-on-rails ruby arrays ruby-on-rails-3 activerecord

我刚注意到,当此对象附加到数组时,正在更新对象的一个​​属性。这种行为对我来说非常令人惊讶,我想我可能会遗漏一些关于ActiveRecord的基本信息。

在我的应用中,每个想法都有一个父(通过其father_id属性)。此关联在models / idea.rb中设置如下:

class Idea < ActiveRecord::Base

  belongs_to :father, :class_name => "Idea" # , :foreign_key => "idea_id"
  has_many :children, :class_name => "Idea", :foreign_key => "father_id", :dependent => :destroy

  [...]

以下是rails控制台中发生的情况:

我首先选择一个给定的想法:

irb(main):003:0> n = Idea.find(1492)
  Idea Load (1.1ms)  SELECT "ideas".* FROM "ideas" WHERE "ideas"."id" = $1 LIMIT 1  [["id", 1492]]
=> #<Idea id: 1492, father_id: 1407, [...]>
然后我通过协会检索其子女:

irb(main):004:0> c = n.children
  Idea Load (0.5ms)  SELECT "ideas".* FROM "ideas" WHERE "ideas"."father_id" = 1492
=> []

它没有,这没关系。 然后我想将这个想法本身附加到'c'变量,但这会在数据库中触发不需要的UPDATE操作:

irb(main):005:0> c << n
   (0.1ms)  BEGIN
   (0.9ms)  UPDATE "ideas" SET "father_id" = 1492, "updated_at" = '2013-12-06 12:57:25.982619' WHERE "ideas"."id" = 1492
   (0.4ms)  COMMIT
=> [#<Idea id: 1492, father_id: 1492, [...]>]

现在,值为1407的father_id属性的值为1492,即构思的id。

任何人都可以解释为什么会发生这种情况,以及如何在不改变对象属性的情况下创建包含对象子节点和对象本身的数组?

注意:我正在使用ruby 1.9.3p448(2013-06-27修订版41675)[x86_64-darwin13.0.0]

1 个答案:

答案 0 :(得分:1)

这是预期的行为。您正在为属于特定父亲的一组创意添加新想法。这是因为它不是你要追加的数组,它是一个ActiveRecord关联。在您的控制台中,尝试n.children.class

如果你想要一个不会修改附加到它的对象的平面数组,你需要:

c = n.children.to_a

c << n