Rails为变量分配名称

时间:2011-09-20 00:46:25

标签: ruby-on-rails-3

我正在构建用户排名系统,并尝试使用名称分配user.rank值。 我想在我的用户模型中定义类似的东西,然后在显示每个用户的排名时能够引用它,但这可能不是最好的方法:

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...

但不知道该怎么做。有人有什么想法?我甚至不确定该怎么称呼我正在尝试做什么,因此很难自己研究。

2 个答案:

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

答案 1 :(得分: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