为什么没有`self`就无法更新ActiveRecord模型中的关联属性?

时间:2013-01-24 19:59:25

标签: ruby-on-rails ruby ruby-on-rails-3 rails-activerecord

我定义了一个模型 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

看起来很奇怪!

2 个答案:

答案 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.前加上以消除歧义并执行赋值方法。