2012-01-15 2 views
1

내 모델을 효율적으로 정리하는 데 문제가 있습니다. 이 모델의 종류 :레일 : 모델을 정렬하는 방법?

City 
Building 
CityBuilding 
WoodProduction 

이제 도시에는 city_buildings를 통해 많은 건물이 있습니다. 도시 건물에는 인구와 같은 기본적인 속성이 있습니다. 그러나 제재소에 대해 말하면 목재 생산량과 같이 더 많은 정보를 보유해야하는 2 개의 건물이 있습니다.

그래서,이 예에서, 제재소, 나는 같은 것을 할 수 있기를 원하는 것 :

current_city.wood_production.amount 

을 그리고 나무의 양을 얻을, 도시 한 wood_production 연결을 가지고 제공. 이 시점까지는 모든 것이 잘됩니다.

하지만 wood_production은 목재가 생성되는 속도도 저장해야합니다. 이 비율은 제재소 건물 수준에 대한 정보가 필요한 공식에 의해 산출됩니다 (city_buildings에서 찾을 수 있음). 매우 부 자연스러운 느낌이 경우는, 작동하지만

c = City.first 
w = c.wood_production 
w.city_buildings.where(:building_id => ...).level 

: 그래서, 지금 내가 좋아하는 뭔가를 실행할 수 있습니다

has_many :city_buildings, :through => :city 

:

나는 그것이 같은 wood_production에 중첩 된 연결을 사용하여 작업을 만든 나는 이것을 달성하는 훨씬 더 좋은 방법이 있음을 확신합니다.

제발 뭐라고 제안 해주세요 :)?

편집 : 범위가 제재소 건물의 범위 지정과 같은 멋진 솔루션의 일부일 수 있다고 생각합니다. 어쩌면 누군가가 더 자세하게 생각해봤을 것입니다.

+0

를 작동하지 않을 것입니다, 그러나 확실하게 건물 만에 속할 수 있습니다 하나의 도시 ... –

+0

아뇨, 건물은 건물의 정적 인 표현이므로 많은 도시에 속할 수 있습니다. 반면에 city_building은 실제로 특정 도시에만 속할 수 있습니다 (많은 것을 통해 진행됩니다). – Spyros

+0

여기에 어떤 문제가 있습니까? wood_production에서 제재소 builing에가는 더 쉬운 방법을 찾고 있습니까? –

답변

1

맞아요. 그럼 관용 협회가 맞습니다. has_one : 제재소의 building_id가 해결 된 경우 당신은 다른 연결을

has_many :sawmills, :through => :city, :source => :city_buildings, :conditions => {:building_id => SAWMILL_BUILDING_ID} 

w.sawmills.first.level 

편집을 추가 할 수 has_many까지 내가 여기에 그대로있는거야

+0

예,이 하나의 작품을 잘 고마워! (has_one으로 작업했습니다) – Spyros

+0

nice, nice to know :) –

관련 문제