2011-09-20 83 views
0

我正在構建一個用戶排名系統,並且正在嘗試使用名稱分配user.rank值。 我想在我的用戶模型來定義這樣的事情,然後可以顯示每個用戶的排名時,引用它,但是這可能不是最好的辦法:Rails爲變量分配名稱

class User < ActiveRecord::Base 
    RANK_NAMES = { 
    'Peasant' => (0..75), 
    'Craftsman' => (76..250), 
    'Vassal' => (251..750), 
    'Noble'  => (750..1500), 
    'Monarch' => (1501..999999) 
    } 

也許這將是更好的定義方法在控制器或幫手像:

if user.rank == 0..75 
    rank_name = "Peasant" 
elsif... 

但不知道該怎麼做。任何人有任何想法?我甚至不知道該怎麼稱呼我正在努力做什麼,因此很難單獨進行研究。

+0

你的'='和'=='倒退了嗎? – nowk

+0

是的,只是修好了。 –

+1

我會考慮將此分解爲單獨的模型,因爲您可能希望添加/編輯/刪除排名。雖然把它放在'User'中可能看起來很有意義,但是你在'User'和本質上是'RankClassification'之間引入了緊密耦合。 –

回答

1

假設user.rank存在,它可能就像這樣簡單。

class User < ActiveRecord::Base 
    ... 
    def rank_name 
    case self.rank 
     when 0..75 
     'Peasant' 
     when 76..250 
     'Craftsman' 
     when 251..750 
     'Vassal' 
     when 750..1500 
     'Noble' 
     when 1501..999999 
     'Monarch' 
    end 
    end 
    ... 
end 
+0

這正是我所需要的,我只是不確定如何正確編寫它。感謝Adam。 –

0

如果rank_name具體User,我會讓它的User的方法。

你可以嘗試下面的東西。它可能會給你一些想法。

class User 
    RANKS = [ 
    {:name => 'Peasant', :min => 0, :max => 75}, 
    {:name => 'Craftsman', :min => 76, :max => 250} 
    # ... 
    ] 

    attr_accessor :rank 

    def rank_name 
    # TODO what happens if rank is out of range of all ranks or rank is nil 
    # or not an integer 
    User::RANKS[rank_index][:name] 
    end 

    private 

    def rank_index 
    User::RANKS.index { |r| (r[:min]..r[:max]).include? @rank } 
    end 
end 

user = User.new 
user.rank = 76 
puts user.rank_name # -> Craftsman