Ruby on rails 重新加载模型属性

Ruby on rails 重新加载模型属性,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,刷新给定模型属性的最佳方法是什么 也就是说,在功能上,我希望: post.body = Post.find(post.id).body 用更好的语法。也许吧 post.reload_body! 编辑:我只想重新加载一个属性(不是一次加载所有属性)我不明白您为什么要这样做,但是: def reload_attribute(attr) value = self.class.where(:id=>id).select(attr).first[attr] self[attr] = va

刷新给定模型属性的最佳方法是什么

也就是说,在功能上,我希望:

post.body = Post.find(post.id).body
用更好的语法。也许吧

post.reload_body!

编辑:我只想重新加载一个属性(不是一次加载所有属性)

我不明白您为什么要这样做,但是:

def reload_attribute(attr)
  value = self.class.where(:id=>id).select(attr).first[attr]
  self[attr] = value
end
这将发出一个
SELECT
,它只检索一列并将其值分配给当前模型实例中的属性。打电话(例如):


实际上,您应该只使用
post.reload
()。除非您有非常宽的列,在执行
SELECT*

时会带来一些性能成本,否则刷新模型属性是什么意思?上下文是什么?问题标题和内容相互冲突。您是只想刷新指定的属性,还是可以全部刷新?@Heikki:指定的属性(我更新了问题以使其更清楚),您能详细说明一下为什么只需要重新加载一个属性吗?如果我们了解整个设置,就有更好的机会理解好的语法。这里有一个用例:我有一个屏蔽SSN的表单,如“******1234”。如果我检测到进入的SSN只是当前SSN的屏蔽版本,我想绕过该字段上的验证,而不去管它。如果来自表单的SSN是其他内容,我希望验证并尝试保存新的SSN。为了了解差异,我需要数据库中的SSN(当然我已经加密了)。如果您有(比如)自定义访问器等,这也会是一个问题。我看到的用例是避免清除关系缓存。如果我只刷新对象的一个属性,那么已经加载的关系将不会在之后触发新的SQL调用。
post = Post.find(1)
post.reload_attribute(:body)