2010-07-23 1 views
-1

У меня есть одна модель, заявляющая пользователь, которая может жить в нескольких городах (представлена ​​в качестве другой модели). Если я создаю нового пользователя, я должен выбрать (и отредактировать) разные города, в которых они живут. Из-за ограничений по времени я часто получаю решение «хакерство, чем мне хотелось», включающее что-то вроде: http://blog.hasmanythrough.com/2006/4/20/many-to-many-dance-off.Самый чистый способ обработки отношений «многие ко многим» в рубине на рельсах?

Любые красивые решения, которые популярны в SO?

веселит ...

Slothishtype

+0

Что вы пытаетесь сделать ?! –

ответ

0

has_and_belongs_to_many ассоциация была построена именно по этой ситуации. Вот документация по нему: http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_and_belongs_to_many

В противном случае, если вам необходимо сохранить информацию в самой ассоциации (поля, которые не существовали бы в таблице города или таблице пользователя, но между ними), вы можете просто установить две параллельные «has_many_through» ассоциации и настроить отдельную таблицу «user_city». Так было бы в таблице пользователей

has_many :user_cities 
has_many :cities, :through => :user_cities 

и в таблице городов

has_many :user_cities 
has_many :users, :through => :user_cities 

Затем, вы можете просто позвонить: user.cities и получить список городов пользователь живет.

+0

Я использую много, но в конечном итоге с некоторым грязным кодом при создании отношений. Например, у меня есть сайты и период, связанные с сайтом. В моем контроллере "создать действие" Я реализовать что-то вроде: #add периодов если (PARAMS [: периоды]) # Удаления текущего периода для siteperiod в @ site.siteperiods \t siteperiod.destroy конца для period_id в Params [: периоды] \t siteperiod = Siteperiod.new \t siteperiod.period_id = period_id \t siteperiod.site_id = @ site.id \t siteperiod.save конец конец Это оставляет меня толстым уродливым контроллером; все очень не-рельсовые. Cheers ... Slothistype – slotishtype

+0

Подождите, я не думаю, что понимаю - если в этом примере сайт имеет и принадлежит ко многим периодам через site_period, то почему вы автоматически захотите удалить сайт, если он не был связанный с периодом больше? Если бы вы DID, вы могли бы сделать его зависимым, и я бы предположил, что он удалит его самостоятельно, но я думаю, что я должен что-то упустить? – jasonpgignac