0

編集:

私はこれをリファクタリングしようとしています:

self.before_create do |obj|
  obj.position = self.class.count
end

これに:

self.before_create :set_position

private

def set_position
  obj.position = self.class.count
end

しかし、その表示エラー:

 undefined local variable or method `obj'

これをどのように修正しますか?

4

2 に答える 2

2
class YourClass < AR

  before_create :set_position

  private

  def set_position
    self.position = @@count
  end
end

set_positionメソッドはインスタンス メソッドなので、selfインスタンスに割り当てられます。countクラス変数であるべきだと私は信じています。

于 2012-08-14T00:14:10.893 に答える
1
class Something < ActiveRecord::Base
  before_create :set_position

  protected
  def set_position
    self.position = self.class.count
  end
end

クラス変数を使用すると、サーバーが複数のプロセスを使用している場合に問題が発生する可能性があることに注意してください (プロセス@@count間の同期が失われる)。countデータベースからの機能的なスタイルのクエリ。

注:この動作の多く (適切に実装されたリストへのアトミックな変更を含む) は、しばらく前に Rails の一部であったacts_as_list gem で見つけることができます。それを使用することをお勧めします。

于 2012-08-13T23:39:48.353 に答える