在Ruby on Rails中存储数据库查询的变量

时间:2014-06-15 18:35:16

标签: ruby-on-rails ruby

我有一个小Rails初学者问题:

在我的Rails帮助器中,我创建了一个方法,我用它来显示我的视图中的价格:

    def price    
     pricea = Hotel.order(wdpricenm: :asc).first 
     priceb = Hotel.order(wepricenm: :asc).first

     if (pricea.wdpricenm + priceb.wepricenm) < (priceb.wdpricenm + priceb.wepricenm) 
       return (pricea.wdpricenm + priceb.wepricenm)
     else 
       return (priceb.wdpricenm + priceb.wepricenm) 
     end

   <td><%= price %></td>

它的工作没有问题,但我想把pricea / priceb变量(存储查询)放在rails应用程序的其他地方,因为我也想将它们用于其他方法。

我的问题是:你会建议将这些价格变量放在Rails中,特别是你会使用哪些变量类型?

感谢所有回复,

干杯罗布

3 个答案:

答案 0 :(得分:4)

使用范围:http://guides.rubyonrails.org/active_record_querying.html#scopes

Class Hotel < ActiveRecord:Base
  scope :pricea, -> { order(wdpricenm: :asc).first }
  scope :priceb, -> { order(wepricenm: :asc).first }
end

答案 1 :(得分:1)

Class Hotel < ActiveRecord:Base

  def self.pricea
    self.order(wdpricenm: :asc).first
  end

  def self.priceb
    self.order(wepricenm: :asc).first
  end

end

现在您可以使用:

pricea = Hotel.pricea
priceb = Hotel.priceb

如果您需要在不同视图中提供这些价格,您可以在控制器中执行此操作:

Before_action :retrieve_prices, only: [:action1, :action2]

def retrieve_prices
  @pricea = Hotel.pricea
  @priceb = Hotel.priceb
end

这样,这些变量仅适用于所选操作,并且这些方法可以在任何地方重复使用。

答案 2 :(得分:0)

编辑:每条评论

在模型中:

Class Hotel < ActiveRecord::Base
  scope :weekday_min, -> { where(minimum(:wdpricenm)).first }
  scope :weekend_min, -> { where(minimum(:wepricenm)).first }

  def self.best_deal(weekdays, weekend_days)
    weekday_min_tot = (weekdays * weekday_min.wdpricenm) + (weekend_days * weekday_min.wepricenm)
    weekend_min_tot = (weekend_days * weekend_min.wdpricenm) + (weekend_days * weekend_min.wepricenm)

    [weekday_min_tot, weekend_min_tot].min
  end
end

在控制器中:

@best_deal = Hotel.best_deal

在视图中显示总价格(但没有暗示哪个酒店):

<%= @best_deal %>

请注意缺少助手。

另请注意:最好的交易可能不是这些选择。您需要的是计算每家酒店的总数,然后取最小值。

在你拿起Rails之前,你有一段旅程。这是一个很大的问题。我建议开始使用Hartl教程。并且不要忘记学习Ruby。