Rails: как расставить модели? - PullRequest
1 голос
/ 15 января 2012

У меня возникли проблемы с эффективным размещением моих моделей.Вещи из этих моделей:

City
Building
CityBuilding
WoodProduction

Теперь, конечно, в городе есть много зданий через city_buildings.У городского здания есть некоторые основные признаки как население, живущее там.Тем не менее, есть 2 здания, в которых нужно хранить больше информации, например, о количестве произведенной древесины, если мы говорим о лесопилке.

Итак, в этом примере на лесопилке я бы хотел иметь возможностьсделайте что-то вроде:

current_city.wood_production.amount

и получите количество древесины при условии, что в городе есть одна ассоциация wood_production.До этого момента все было в порядке.

Но для производства древесины также необходимо хранить данные о скорости производства древесины.Этот показатель рассчитывается по формуле, которая требует информации об уровне здания лесопилки (находится в city_buildings).

Я сделал это, используя вложенную ассоциацию в wood_production, например:

has_many :city_buildings, :through => :city

Итак, теперь я могу выполнить что-то вроде:

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

Что хотя и работает, если чувствует себя очень неестественно, и я вроде как убежден, что есть гораздо лучший способ добиться этого.

Что-нибудь предложить, пожалуйста :)?

РЕДАКТИРОВАТЬ: Я чувствую, что сфера может быть частью хорошего решения, например, указание области для строительства лесопилки, может быть, кто-то придумал что-то более подробно,Сейчас я как бы обрабатываю эту идею.

1 Ответ

1 голос
/ 15 января 2012

правильно, поэтому вы имеете правильную сквозную связь.Если building_id на лесопилке является фиксированным, вы можете добавить еще одну ассоциацию

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

w.sawmills.first.level

edit: has_one: сквозь has_many не будет работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...