2009-07-01 2 views
1

이것은 스택에 대한 첫 번째 게시물입니다. 그래서 어떤 프로토콜을 위반하면 나와 함께 견뎌주십시오.많은 것을 통해 많은 것을 선택하십시오 ...

나는 레일에서 프로젝트 (2.1.2)에 일하고 있어요, 나는이처럼 보이는 관계 시나리오가 : 이벤트 일에 가입 할 수 있습니다

event [has_many] days 

사람들 (다른 범주를)

category [has_many] customers [has_many] orders [has_many] days 
[belongs_to] event 

지금, 나는 한 고객을 위해 '이벤트'의 총 수를 가지고 싶은, 또는 특정 카테고리의 모든 고객을위한, 나는 붙어 다음 바인딩 결과를 제공합니다. AFAIK, 객체 배열을 통해 간단한 '찾기'를 수행 할 방법이 없습니다. 맞습니까? 그렇다면 해결책은 무엇입니까? 중첩 된 루프 및 수집 방법을 사용하여 '요일'의 순서에서 '이벤트'를 가져 옵니까?

불명확 한 경우 알려주십시오.

도움 주셔서 감사합니다.

+0

첫 번째 게시물은 실제로 프로그래밍과 관련되어 있으므로 제대로 된 것입니다. –

답변

0

개인적으로 MySQL 문을 사용하여이 작업을 수행합니다. 나는 확실히 모른다. 그러나 나는 다른 예제들 (레일을 사용하여 연관성 방법들을 제공함)이 훨씬 더 빠르다고 생각한다. 고객 모델에서 당신이 뭔가를 할 수 있다는 것을 의미

: (난 당신이 기본 조합 키를 사용하고 있으리라 믿고있어 참고 : 'model_name_id') 모든 이벤트가 반환

class Customer 
    def events 
    Event.find_by_sql("SELECT DISTINCT e.* FROM events e, days d, orders o, customers c WHERE c.id=o.customer_id AND o.id=d.order_id AND e.id=d.event_id") 
    end 
end 

을 사용자와 관련이 있으며 중복되지 않습니다 ('DISTINCT'키워드가이를 확인합니다). 위 예제에서와 같이 사용자가 정확히 가입 한 날에 대한 정보를 잃게됩니다. 그 정보가 필요하면 그렇게 말하십시오.

또한 본인의 사례를 직접 적용 할 수 있다고 가정했기 때문에 카테고리 모델에 대한 예는 포함하지 않았습니다. 그렇지 않다면 알려주세요.

편집 :

난 그냥 그냥 이벤트를 카운트 할 읽어 보시기 바랍니다. 이는 count 문을 사용하여 더 빨리 (또는 적어도 메모리 집약적으로) 수행 할 수 있습니다. 이를 사용하려면 다음 함수를 사용하십시오.

def event_count 
    Event.count_by_sql(SELECT DISTINCT COUNT(e.*) FROM ... ... ... 
end 
0

귀하의 모델은 아마도 다음과 같이 :

events = customer.days.count(:group => 'event_id') 

그것은 다음과 같이 OrderedHash 반환합니다 : 당신이 할 수있는

#<OrderedHash {1=>5, 2=>13, 3=>0}> 

를이와

class Category 
    has_many :customers 

class Customer 
    has_many :orders 
    has_many :days, :through => :orders # I added this 
    belongs_to :category 

class Order 
    has_many :days 
    belongs_to :customer 

class Day 
    belongs_to :event 
    belongs_to :order 

class Event 
    has_many :days 

당신이 고객에 대한 이벤트를 셀 수 일정 수를 계산하십시오 :

0 1,238,266,

당신은 UNIQ 이벤트의 총 수를 원하는 경우 :

나는 이런 식으로 뭔가 할 거라고 카테고리에있는 모든 고객을위한 이벤트를 계산하는 경우
events.size # => 3 

:

events = {} 
category.customers.each {|c| events.merge!(c.days.count(:group => 'event_id')) } 
events.size # => 9 - it should be total number of events 

을하지만,이 경우 각 이벤트가 몇 번이나 나왔는지 정보를 잃어 버립니다.

나는 이것을 테스트하지 않았으므로 실수가있을 수 있습니다.

관련 문제