我定义了一个模型项,它是ActiveRecord::Base
的子类它具有一个名为 buyer 的关联属性,它是成员
它有一个购买方法来更新买家属性。
# do buy transaction on that item
def buy(people_who_buy, amount)
buyer = people_who_buy
save
....
end
此代码无法更新买方属性。sql 生成仅从数据库中对成员进行 sql 选择。
但是在我buyer
之前添加self.
后,它工作正常。
# do buy transaction on that item
def buy(people_who_buy, amount)
self.buyer = people_who_buy
save
....
end
看起来很奇怪!
write_accessor时需要调用self.write_accessor
,而在self.read_accessor
中可以省略self
(通常避免使用以保持代码尽可能干净)。
来自社区编辑的 ruby 风格指南:
在不需要的地方避免自我。(仅在调用 自写访问器。
# bad def ready? if self.last_reviewed_at > self.last_updated_at self.worker.update(self.content, self.options) self.status = :in_progress end self.status == :verified end # good def ready? if last_reviewed_at > last_updated_at worker.update(content, options) self.status = :in_progress end status == :verified end
这不仅仅是一个 ActiveRecord 问题。 Ruby 解析器将像 foo = 123
这样的表达式视为局部变量赋值。 为了调用访问器方法,您需要前缀self.
以消除歧义并执行赋值方法。