2

モデル ユーザーを考えてみましょう。

User(id: integer, name: string, email: string, status: string)

アプリケーションを作成したとき、ステータスはデータベースのフィールドでした。ただし、新しい要件は変更を意味するため、場合によってはステータスが動的に計算されます。たとえば、日曜日に姓が A で始まる場合、そのステータスは「not ok」です。

この機能を User モデルに次のようにカプセル化したいと思います。

Class User < ActiveRecord::Base

  def status
    if is_sunday && last_name.starts_with('A')
        return 'not ok'
    else
       return status
    end
  end

end

これを行う最善の方法は何ですか?上記のコードが機能する場合、データベース内のフィールドをメソッドでオーバーライドするのは悪い習慣のようです。

get_statusまたは、上記のコードを使用するメソッドを作成することもできます。ただし、この場合status、アプリケーション全体ですべての参照を変更する必要があります。それはよく聞こえません。

4

1 に答える 1

4

ActiveRecord::Base のドキュメントで、ActiveRecordが提供するデフォルトのアクセサーをオーバーライドできることを見てきました。もちろんstatus、メソッドが多少再帰的になるため、そのまま使用することはできません。

read_attribute(:attribute_name)必要に応じてまたはを使用して、DB 内の列の値にアクセスできますself[:attribute_name]。簡単に言えば、アクセサは次のようになります。

Class User < ActiveRecord::Base
  def status
    if is_sunday && last_name.starts_with('A')
      'not ok'
    else
      read_attribute(:status)
    end
  end
end

更新:私はそれを試してみましたが、動作しますが、このメソッドを明示的に呼び出さないと DB コンテンツを取得するので注意してください...たとえば、usersテーブルをクエリしてユーザーを見つけようとすると、status = "not ok"驚きが生じる可能性があります。

于 2012-04-06T22:49:55.187 に答える