我正在编写一个小浏览器游戏作为学习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
答案 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