Как получить конкретные данные из моих таблиц в Rails 3 - PullRequest
0 голосов
/ 01 мая 2011

Вот мои модели:

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

Я хочу фильтроватьвниз через мои таблицы, чтобы показать общие или средние затраты на основе определенных критериев.Поэтому, если, например, я хочу узнать общую или среднюю стоимость (атрибут: сумма из модели стоимости) всех фруктов за определенный период времени (отсортированный в модели списка по: кварталу и: году).Это более понятно?Спасибо за отзыв до сих пор.

1 Ответ

1 голос
/ 02 мая 2011

Вы должны исправить ваши модели в первую очередь. У вас есть Стоимость, относящаяся как к Списку, так и к Пищу, но нет ни одного внешнего ключа ни для одной из ваших миграций. В общем случае, если модель A: принадлежит_ модели B, для таблицы модели A в качестве внешнего ключа требуется b_id.

Как только вы исправите это, так как вы хотите агрегировать, вам нужно будет построить запрос на основе модели, которая имеет значение для агрегирования - в данном случае, Cost. Вы хотите ограничить это, чтобы включить только те затраты, связанные с едой с определенным атрибутом - поэтому используйте цепочку методов, как это (при условии, что вы используете Rails 3):

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

Ограничить это по году и кварталу становится немного сложнее, но работает в том же духе, но чтобы дать вам твердый совет по этому поводу, вам нужно сначала починить свои модели. Я рекомендую прочитать эти два руководства:

EDIT

После редактирования попробуйте это (не проверено):

Cost.includes(:food, :list).where('foods.type = ? AND lists.year = ? AND lists.quarter = ?', 'fruit', 2011, 1).average(:amount)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...