纠正参考表的ActiveRecord关联?

时间:2012-11-22 00:46:26

标签: ruby ruby-on-rails-3 activerecord relational-database

鉴于两种模式:

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关联是什么?据我所知,基于documentation,'用户belongs_to:user_status'是我最好的选择,但在语言上这是失败;因为用户不“属于”状态,用户处于状态或具有状态。或者这对我来说太过分裂?

1 个答案:

答案 0 :(得分: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" }

您想要按摩它的距离取决于您。