如何用其他表中的数据填充rails表?

时间:2013-01-27 19:45:47

标签: ruby-on-rails ruby-on-rails-3 database-design

我是一个noob程序员,如果问题不够明确,请道歉。

我正在尝试创建一个基本的rails应用程序,其中有3个不同的表:用法(月份,用量),价格(月份,价格)和花费(月份,支出)。 我试图得到它,以便花费= usages.usage * prices.price。我将以下代码放入我的支出模型中:

class Spend < ActiveRecord::Base
  c = Usage.all.count
      i = 1
      while i <= c
          u = Usage.find(i)
          p = Price.find(i)
          Spend.create(month:u.month, spend:u.usage*p.price)
          i += 1
      end
end

这最初效果很好,但是一旦我开始添加和删除用法和价格,他们的ID就会发生变化,所以它不是那么明确。我怎么能以更好的方式做到这一点?

谢谢,

千电子伏

2 个答案:

答案 0 :(得分:2)

在这种情况下,我会反对制作单独的Spend模型,因为它所做的只是计算数据库中已存在的数据。除非你有严格的缓存要求(我怀疑你的情况),你可以使用简单的实例方法来检索你想要的数据。

首先弄清楚您的使用情况和价格模型是如何相关的。因为你似乎是通过id关联它们,所以它似乎是一对一的关系(如果我错了,请纠正我)。但是,通过假设它们具有相同的主键来关联是一种危险的方法 - 而是使用外键将一个模型指向另一个。我们将选择Price模型来保存Usage的主键,但反过来也可以。您需要使用以下迁移添加列:

def change
  add_column :prices, :usage_id, :integer
end

您的模型应如下所示:

class Usage < ActiveRecord::Base
  has_one :price

  def spend
    usage * price.price
  end
end

class Price < ActiveRecord::Base
  belongs_to :usage
end

您可以找到个人spend项的usage值,如下所示:

usage = Usage.find(some_id)
puts usage.spend

或者你可以得到这样的多个'花费':

Usage.include(:price).each do |usage|
  puts usage.spend
end

我遗漏了对月份的任何提及,因为我不确定您是如何使用它的,或者根本需要计算spend

答案 1 :(得分:0)

查看Active Record关联指南:http://guides.rubyonrails.org/association_basics.html