1

与えられた 2 つのモデル:

class User < ActiveRecord::Base
  attr_accessible :name, :user_status

end

class UserStatus < ActiveRecord::Base
  attr_accessible :descr
end

user.user_status 列は、ステータス アイコンや説明などの追加情報を取得するために UserStatus と結合するために使用できる単一の ID を意図しています。

UserStatus は読み取り専用の参照テーブルであり、行数が非常に少なく、すべてが一意です。4行しかないとしましょう:

{ :id => 0, :descr => 'New' },
{ :id => 1, :descr => 'Banned' },
{ :id => 2, :descr => 'Active' },
{ :id => 3, :descr => 'Unverified' }

参照テーブルの ActiveRecord 関連付けを気にする必要がありますか? もしそうなら、関連付けられた UserStatus ID をユーザーテーブルに保存したい (または保存しなければならない) 場合、適切な ActiveRecord 関連付けは何ですか? ドキュメントに基づいて私が言えることから、「ユーザーの所属先:ユーザーのステータス」が私の最善の策ですが、言語的にはこれは失敗です。ユーザーはステータスに「属していない」ため、ユーザーは状態またはステータスを持っています。それとも、これは私があまりにも髪を裂くだけですか?

4

1 に答える 1

2

belongs_to常に言語的に意味があるとは限りませんが、この場合はまさにあなたが望むものです。

UserStatus has_many :users
User belongs_to :user_status

これにより、ステータスでその状態のすべてのユーザーを見つけることもできます。これは便利です。

naughtyPeople = UserStatus.where(descr: 'Banned').users

言語的にさらに重要なのは、このデータを取得するために使用する API です。

User.find(123).user_status.descr

そういうのは最悪だ。必要な関係がありますが、API はかなり冗長です。

class User
  def status
    user_status.descr
  end
end

User.find(123).status

ずっといい。

または、おそらくこれ!

class User
  def status
    user_status.descr
  end

  def status=(status_string)
    self.user_status = UserStatus.where(descr: status_string).first
  end
end

user = User.find(123)
user.status = 'Banned'
user.user_status #=> { id: 3, descr: "Banned" }

どこまでマッサージするかはあなた次第です。

于 2012-11-22T00:52:37.750 に答える