以下是我的模型:
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)