如何获得特定的数据从我的表在Rails 3



以下是我的模型:

class Food < ActiveRecord::Base
  has_many :lists
  has_many :costs, :through => :lists
end
class List < ActiveRecord::Base #each food can have multiple lists, ordered by date
  belongs_to :food
  has_many :costs, :dependent => :destroy
  accetps_nested_attribute_for :costs, :allow_destroy => true
end
class Cost < ActiveRecord::Base #costs are nested inside of a list
  belongs_to :food
  belongs_to :list
end

这是我的模式(你需要看到的部分):

create_table "foods", :force => true do |t|
  t.integer  "food_id"
  t.string  "name"
  t.string  "type" # this is where I can choose a 'fruit' or a 'vegetable'
end
create_table "lists", :force => true do |t|
  t.integer "food_id"
  t.integer  "quarter" #this is how lists are ordered
  t.integer  "year"
end 
create_table "costs", :force => true do |t|
  t.integer  "amount" 
  t.integer "list_id"
  t.integer "food_id"
end

我想做的是能够过滤我的表,以显示基于某些标准的总成本或平均成本。例如,如果我想知道某段时间内(在列表模型中按季度和年排序)所有水果的总成本或平均成本(成本模型中的:amount属性)。这样更清楚了吗?感谢您的反馈。

您需要首先修复您的模型。你有属于List和Food的Cost,但是在你的迁移中没有外键。一般来说,如果模型A:belongs_to模型B,则模型A的表需要b_id作为外键。

一旦您解决了这个问题,因为您想要聚合,您将不得不基于具有要聚合的值的模型构建查询-在本例中为Cost。如果您希望将其限制为仅包含与具有特定属性的Food相关的那些成本,那么使用方法链(假设您使用Rails 3):

# average cost of all fruit
Cost.includes(:food).where('foods.type = ?', 'fruit').average(:amount)

按年和季度来限制这一点有点复杂,但工作原理相同,但为了给你可靠的建议,你需要首先修复你的模型。我建议你仔细阅读这两个指南:

  • http://guides.rubyonrails.org/association_basics.html
  • http://guides.rubyonrails.org/active_record_querying.html

编辑

编辑完成后,试试这个(未测试):

Cost.includes(:food, :list).where('foods.type = ? AND lists.year = ? AND lists.quarter = ?', 'fruit', 2011, 1).average(:amount)

相关内容

  • 没有找到相关文章

最新更新