1

给定两个模型:

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

end

class UserStatus < ActiveRecord::Base
  attr_accessible :descr
end

user.user_status 列旨在成为单个 ID,可用于与 UserStatus 结合以获取其他信息,例如状态图标和描述。

UserStatus 是一个只读引用表,它的行数非常少,而且都是唯一的。假设它只有四行:

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

我应该为引用表烦恼 ActiveRecord 关联吗?如果是这样,如果我想(或必须)将关联的 UserStatus ID 存储在用户表中,那么正确的 ActiveRecord 关联是什么?据我所知,根据文档,'User belongs_to :user_status' 是我最好的选择,但在语言上这是失败的;因为用户不“属于”某种状态,所以用户处于某种状态或具有某种状态。还是这太让我毛骨悚然了?

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 回答