1

我已经定义了一个模型项目,它是它的子类,ActiveRecord::Base 它有一个名为买家的关联属性,它是成员

它有一个购买方法来更新买家属性。

# do buy transaction on that item
def buy(people_who_buy, amount)
  buyer = people_who_buy
  save
  ....
end

此代码无法更新买家属性。sql generate 只对数据库中的成员进行 sql 选择。

但是在我添加self.之前buyer,它工作正常。

# do buy transaction on that item
def buy(people_who_buy, amount)
  self.buyer = people_who_buy
  save
  ....
end

看起来很奇怪!

4

2 回答 2

4

调用self.write_accessorwrite_accessor 时需要调用,而 inself.read_accessor可以self省略(通常会避免以保持代码尽可能干净)。


来自社区编辑的 ruby​​ 样式指南

在不需要的地方避免使用 self。(仅在调用自写访问器时才需要。)

# 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
于 2013-01-24T20:12:02.313 回答
2

这不仅仅是一个 ActiveRecord 问题。Ruby 解析器将表达式foo = 123视为局部变量赋值。为了调用访问器方法,您需要添加前缀self.以消除歧义并执行分配方法。

于 2013-01-24T20:21:07.037 回答