6

所以我在我的应用程序代码追加到像这样的“< <”运营商的has_many关系:Rails的ActiveRecord的铁锹(<<)运算符

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的的<<运营工作,并在那里我可以阅读更多关于它?

感谢

回答

12

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

self.comments << @new_comment 

@new_comment添加到comments收集和跑动更新SQL,而不必等待父对象上保存或更新调用,除非父对象是一个新的记录。

this documentation

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

+4

哦,我明白了,我有麻烦查找了很多“<<” - 很高兴知道它的名字叫“铲”运营商:) – cozos

+1

实际上它节省了推只记录如果“父母”项目回答“持续?”。如果您在new_record上调用“<<”,它不会保存在数据库中。 – sekmo

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