如何在Ruby on Rails中过滤嵌套哈希?

时间:2015-01-15 18:35:36

标签: ruby-on-rails ruby

在我的Rails 4应用程序中,我有一个(非ActiveRecord)模型,其中包含用户可以订阅的plans

class Plan

  PLANS = {
    'free'            => { :name => "Free",     :amount => 0,     :interval => '',   :maximum => FREE_MAXIMUM },
    'basic_monthly'   => { :name => "Basic",    :amount => 500,   :interval => 'month', :maximum => BASIC_MAXIMUM },
    'basic_yearly'    => { :name => "Basic",    :amount => 5000,  :interval => 'year',  :maximum => BASIC_MAXIMUM },
    'premium_monthy'  => { :name => "Premium",  :amount => 1000,  :interval => 'month', :maximum => PREMIUM_MAXIMUM },
    'premium_yearly'  => { :name => "Premium",  :amount => 10000, :interval => 'year',  :maximum => PREMIUM_MAXIMUM }
  }

  def self.all
    ...
  end

  def self.all_payable
    ...
  end

  def self.by_interval(interval)
    ...
  end

end

我已经与ActiveRecord合作了很多,但在这种情况下,我不知道如何过滤哈希值,以便我可以将它们渲染到前端。

class PagesController < ApplicationController

  def pricing
    @plans = Plan.all
  end

end

如何做到这一点?

也许我的方法完全错误,将计划存储在数组中会更容易吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

数组或散列可以用于此目的。如果我理解正确,你的方法应该是这样的。

def self.all
  # returns the entire PLANS hash
  PLANS
end

def self.all_payable
  # only return hash elements that are not free
  PLANS.find_all { |k,v| v[:name] != 'Free' }
end

def self.by_interval(interval)
  # return all elements where the :interval matches interval
  PLANS.find_all { |k,v| v[:interval] == interval }
end

希望这有帮助!