我定义了一个模型 Item ,它是ActiveRecord::Base
的子类
它有一个名为buyer的关联属性,它是成员
它有一个更新买方属性的买方法。
# do buy transaction on that item
def buy(people_who_buy, amount)
buyer = people_who_buy
save
....
end
此代码无法更新买方属性。 sql生成只从数据库中选择sql成员。
但是我在self.
之前添加buyer
后,效果很好。
# do buy transaction on that item
def buy(people_who_buy, amount)
self.buyer = people_who_buy
save
....
end
看起来很奇怪!
答案 0 :(得分:4)
调用write_accessor时需要调用self.write_accessor
,而在self.read_accessor
中可以省略self
(通常可以避免代码保持干净)。
来自community-edited ruby styleguide:
在不需要的地方避免自我。 (只有在打电话时才需要 自写访问器。)
# 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
答案 1 :(得分:2)
这不仅仅是一个ActiveRecord问题。 Ruby解析器将类似foo = 123
的表达式视为局部变量赋值。为了调用访问器方法,您需要在self.
前加上以消除歧义并执行赋值方法。