13

因此,我的应用程序中有代码附加到与“<<”运算符的 has_many 关系,如下所示:

class BlogPost < ActiveRecord::Base    
    has_many :comments

    def add_comment(content)
        @new_comment = Comment.create(content)
        self.comments << @new_comment
    end
end

它似乎有效。我从来没有真正质疑过它或想知道它何时调用“保存”(我想我从未对何时调用“保存”有深刻的理解)。

但是,after_save评论的钩子似乎没有在我的add_comment函数中被激活,这促使我问:

操作员如何<<在 activerecord 中工作,我在哪里可以了解更多信息?

谢谢

4

2 回答 2

20

当您使用shovel运算符 ( <<) 时,Rails 会自动保存关联的对象。所以,当你这样做时:

self.comments << @new_comment

@new_comment被添加到comments集合中并立即触发更新 SQL,而无需等待父对象上的保存或更新调用,除非父对象是新记录。

这个文档

collection<<(object, ...)通过在连接表中创建关联将一个或多个对象添加到集合中(collection.push 和 collection.concat 是此方法的别名)。请注意,此操作会立即触发更新 SQL,而无需等待父对象上的保存或更新调用,除非父对象是新记录。

于 2015-10-05T04:31:17.997 回答
0

集合<<(对象,...)

通过在连接表中创建关联(collection.push 和 collection.concat 是此方法的别名)或将它们的外键设置为集合的主键,将一个或多个对象添加到集合中。请注意,此操作会立即触发更新 SQL,而无需等待父对象上的保存或更新调用,除非父对象是新记录。

例子:

class Group < ActiveRecord::Base
  has_many   :users
  has_many   :avatars, through: :users
end

class User < ActiveRecord::Base
  belongs_to :group
  has_one    :avatar
end

class Avatar < ActiveRecord::Base
  belongs_to :user
end

@group.avatars << Avatar.new   # this would work if User belonged_to Avatar rather than the other way around
于 2017-04-19T17:42:28.597 回答