所以我的应用程序中的代码附加了与"<<"像这样的运算符:
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中工作?我在哪里可以阅读更多有关它的内容?
由于
答案 0 :(得分:14)
当您使用shovel
运算符(<<
)时,Rails会自动保存关联的对象。所以,当你这样做时:
self.comments << @new_comment
@new_comment
被添加到comments
集合中,并立即触发更新SQL而不等待父对象上的保存或更新调用,除非父对象是新记录。
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