2012-11-22 70 views
1

給定兩個模型:更正參考表的ActiveRecord關聯?

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

end 

class UserStatus < ActiveRecord::Base 
    attr_accessible :descr 
end 

的user.user_status柱旨在是可用於加入針對UserStatus的其他信息,如狀態圖標和描述一個單一的ID。

UserStatus是一個只讀參考表,它只有很少幾行,都是唯一的。假設它只有四行:

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

我應該打擾參考表的ActiveRecord關聯嗎?如果是這樣,如果我想(或必須)將關聯的UserStatus ID存儲在用戶表中,那麼適當的ActiveRecord關聯是什麼?根據我所知道的,基於documentation,'User belongs_to:user_status'是我最好的選擇,但語言上這是失敗;因爲用戶不屬於「狀態」,用戶處於狀態或具有狀態。或者這太讓我頭髮分裂了?

回答

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" } 

你想按摩多遠取決於你。

+0

這真的很有幫助。謝謝,亞歷克斯! –