【发布时间】:2016-03-31 00:56:30
【问题描述】:
我做了一个真正的基本 github 项目here 来演示这个问题。基本上,当我创建新评论时,它会按预期保存;当我更新现有评论时,它不会被保存。但是,:autosave => true 的文档并不是这样说的……他们说的恰恰相反。代码如下:
class Post < ActiveRecord::Base
has_many :comments,
:autosave => true,
:inverse_of => :post,
:dependent => :destroy
def comment=(val)
obj=comments.find_or_initialize_by(:posted_at=>Date.today)
obj.text=val
end
end
class Comment < ActiveRecord::Base
belongs_to :post, :inverse_of=>:comments
end
现在在控制台中,我测试:
p=Post.create(:name=>'How to groom your unicorn')
p.comment="That's cool!"
p.save!
p.comments # returns value as expected. Now we try the update case ...
p.comment="But how to you polish the rainbow?"
p.save!
p.comments # oops ... it wasn't updated
为什么不呢?我错过了什么?
请注意,如果您不使用“find_or_initialize”,它的工作原理是 ActiveRecord 尊重关联缓存 - 否则它会过于频繁地重新加载 cmets,从而丢弃更改。即,此实现有效
def comment=(val)
obj=comments.detect {|obj| obj.posted_at==Date.today}
obj = comments.build(:posted_at=>Date.today) if(obj.nil?)
obj.text=val
end
当然,如果我可以对数据库进行操作,我不想遍历内存中的集合。另外,它与新对象而不是现有对象一起使用似乎不一致。
【问题讨论】:
-
在您的第一个示例中,您是否尝试将最后一行称为
p.comment.reload? -
不重要,因为无论你做什么,activerecord 都会决定重新加载整个集合。
标签: ruby-on-rails ruby ruby-on-rails-4 activerecord associations