1

のサブクラスであるモデルアイテムを定義しました。メンバーActiveRecord::Base であるバイヤーと呼ばれる関連付け属性があります。

購入者属性を更新するための購入メソッドがあります。

# 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

変に見えます!

4

2 に答える 2

4

self.write_accessorwrite_accessorを呼び出すときは呼び出す必要がありますが、inはself.read_accessor省略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 に答える