Rails ActiveRecord Shovel(<<<<)运算符

时间:2015-10-05 04:19:58

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord ruby-on-rails-5

所以我的应用程序中的代码附加了与"<<"像这样的运算符:

class BlogPost < ActiveRecord::Base    
    has_many :comments

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

它似乎有效。我从来没有真正质疑它,也不知道它什么时候打电话&#34;保存&#34; (我想我从来没有充分了解何时拨打#34;保存&#34;开头)。

但是,我的after_save函数似乎没有激活注释上的add_comment挂钩,这会提示我问:

<<运算符如何在activerecord中工作?我在哪里可以阅读更多有关它的内容?

由于

2 个答案:

答案 0 :(得分:14)

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

self.comments << @new_comment

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

来自this documentation

  

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

答案 1 :(得分:0)

collection&lt;&lt;(object,...)

  

通过在中创建关联,将一个或多个对象添加到集合中   连接表(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