Rails ActiveRecord Shovel(<<)运算符

coz*_*zos 10 ruby activerecord ruby-on-rails ruby-on-rails-4 ruby-on-rails-5

所以我的应用程序中的代码附加了与"<<"运算符的has_many关系,如下所示:

class BlogPost < ActiveRecord::Base    
    has_many :comments

    def add_comment(content)
        @new_comment = Comment.create(content)
        self.comments << @new_comment
    end
end
Run Code Online (Sandbox Code Playgroud)

它似乎工作.我从来没有真正质疑它或想知道什么时候它叫"保存"(我想我从来没有强烈理解何时称为"保存"开始).

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

<<操作员如何在activerecord中工作?在哪里可以阅读更多信息?

谢谢

K M*_*lam 17

当您使用shoveloperator(<<)时,Rails会自动保存关联的对象.所以,当你这样做时:

self.comments << @new_comment
Run Code Online (Sandbox Code Playgroud)

@new_commentcomments除非父对象是新记录,否则会添加到集合中并立即触发更新SQL而不等待父对象上的保存或更新调用.

这份文件

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

  • 哦,我明白了,我在搜索"<<"时遇到了很多麻烦 - 很高兴知道它被称为"Shovel"运算符:) (4认同)
  • 实际上只有当"父"项对"持久?"响应为真时才保存推送记录.如果在new_record上调用"<<",则不会保存在db上. (3认同)