如何改进此Rails代码?

时间:2009-04-13 18:23:55

标签: ruby-on-rails ruby refactoring

我正在编写一个小浏览器游戏作为学习RoR的项目,我对它很陌生。

这是一个由cronjob定期调用的方法。

我猜应该有一些方法可以添加元素到魔药数组,然后在最后进行批量保存,我也不喜欢每次在循环中点击数据库来获取项目数量市场再次。

def self.restock_energy_potions
  market = find_or_create_market

  potions = EnergyPotion.find_all_by_user_id(market.id)

  while (potions.size < 5)
    potion = EnergyPotion.new(:user_id => market.id)
    potion.save
    potions = EnergyPotion.find_all_by_user_id(market.id)
  end    
end

3 个答案:

答案 0 :(得分:8)

我不确定我是否理解你的问题。你在寻找这样的东西吗?

def self.restock_energy_potions
  market = find_or_create_market   
  potions = EnergyPotion.find_all_by_user_id(market.id)
  (potions.size...5).each {EnergyPotion.new(:user_id => market.id).save }
  end    
end

注意范围内的三点;如果已经有5个,你不想创造药水。

此外,如果您的药水已被链接(例如has_many),您可以通过market.potions属性创建它们(我猜这里是关于用户和市场之间的关系 - 详情取决于您的模型如何设置)并立即保存所有模型。我不认为数据库的节省会很重要。

答案 1 :(得分:0)

假设您的市场/用户has_many药水,您可以这样做:

def self.restock_energy_potions
  market = find_or_create_market
  (market.potions.size..5).each {market.potions.create(:user_id => market.id)}
end

答案 2 :(得分:0)

a)使用协会:

class Market < AR::Base
  # * note that if you are not dealing with a legacy schema, you should
  #   rename user_id to market_id and remove the foreigh_key assignment.
  # * dependent => :destroy is important or you'll have orphaned records
  #   in your database if you ever decide to delete some market
  has_many :energy_potions, :foreign_key => :user_id, :dependent => :destroy
end

class EnergyPotion < AR::Base
  belongs_to :market, :foreign_key => :user_id
end

b)添加每个关联后无需重新加载关联。也移动功能    进入模型:

find_or_create_market.restock

class Market
  def restock
    # * note 4, not 5 here. it starts with 0
    (market.energy_potions.size..4).each {market.energy_potions.create!}
  end
end

c)还要注意创造!而不是创造。    你应该发现错误。    错误处理取决于应用程序。    在你的情况下,因为你从cron运行它你可以做一些事情    *发送带警报的电子邮件    *捕获异常并记录它们,(exception_notifier插件或hoptoad托管服务)    *打印到stderror并配置cron以向某些电子邮件发送错误。

 def self.restock_potions
    market = find_or_create
    market.restock
  rescue ActiveRecord::RecordInvalid
    ...
  rescue
    ...
  end