2011-05-01 3 views
0

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 

내 테이블을 통해 특정 기준에 따라 총 비용 또는 평균 비용을 표시 할 수 있습니다. 예를 들어 특정 기간 동안 모든 과일의 총 또는 평균 비용 (비용 모델의 금액 속성)을 알고 싶으면 (분기 및 연도별로 목록 모델에서 정렬 됨). 그게 더 명확한가요? 지금까지 의견을 보내 주셔서 감사합니다.

+1

를이 q를 이해하는 데 크게 도움이 될 것입니다. 클래스의 산문 설명을 모델의 실제 코드로 바꾼다면 uestion이 더 좋습니다. – Thilo

+0

질문을 편집하고 올바르게 구성하십시오. 이 방법을 이해하기는 너무 어렵습니다. –

+0

@Thilo & @Jatin - 제 질문을 편집했습니다. 바라기를 바란다. – FattRyan

답변

1

먼저 모델을 수정해야합니다. List 및 Food 모두에 속하는 Cost는 있지만 마이그레이션 중에는 외래 키가 없습니다. 일반적으로 모델 A :가 모델 B에 속하면 모델 A의 테이블에는 외래 키로 b_id가 필요합니다.

일단 수정했다면 집계가 필요하므로 집계 할 값 (이 경우에는 비용)이있는 모델을 기반으로 쿼리를 작성해야합니다.

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

년하여이를 제한하고 분기 가져옵니다 (3 레일을 사용하는 가정) 그래서 같은 체인 방법을 사용 - 당신은 어떤 속성을 가진 음식과 관련된 경우에만 그 비용을 포함하는 것을 제한하려면 조금 더 복잡하지만 동일한 라인을 따라 작업하지만, 이에 대한 충고를하기 위해 먼저 모델을 수정해야합니다. 나는이 두 가이드에 최대 읽어 보시기 바랍니다 :

편집

편집 한 후,이 (테스트되지 않은) 시도 :

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

@ Thilo - 의견에 감사드립니다. 최대한 짧게하고 싶었지만 목록과 비용 모두에 _id 필드가있어 모든 것을 연결했습니다. 중첩 된 양식은 훌륭하게 작동합니다. 새 목록을 만들면 food_id가 목록과 비용에 전달됩니다. 그렇다면 분기별로 필터링하는 방법은 무엇입니까? – FattRyan

+0

위대한 작품. 그러나 나는이 질문에 대해 더 복잡한 버전을 가지고 있으며,이 질문에 대한 정확한 답을 얻은 이후로 당신이 한 번 살펴 보길 원합니다. [질문은 여기에 있습니다] (http://stackoverflow.com/questions/5862828/rails-3-complex-data-mining) – FattRyan

관련 문제