2012-05-08 2 views
1

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

Это место, где люди либо ищут место для проживания, либо у них есть место для проживания. Поэтому у меня есть две категории пользователей, которыми может быть человек. Эти две категории очень разные (т. Е. Человек, ищущий место для проживания, будет иметь очень разные поля для человека, у которого есть место для проживания).

Так Пользователь имеет:

User: name, email, password, profile_id 

Пользователь также может иметь профиль (т.е. они ищут дом).

Profile: age, sexuality, religion, occupation 

Это то, что у меня есть на данный момент. Теперь мне нужно, чтобы изменить это немного, так что пользователь может иметь профиль или ... они могут иметь дом (то есть у них есть дом и ищут больше людей):

House: price_per_week, address, etc 

Как лучше эта модель в ActiveRecord? Полиморфная ассоциация какого-то рода?

ответ

1

Я обнаружил, что полиморфные отношения со временем не работают, если объекты, которые они моделируют, даже незначительно отличаются. В вашем случае я бы рекомендовал сохранить два объекта отдельно.

В общем, лучший способ - рассмотреть способ, которым вы хотите получить данные. Например, я предположил бы, что вы хотите получить доступ как:

@user.house 

или

@user.profile 

Так что я бы рекомендовал начало, установив отношения (которые могут быть дополнительно) между users столом и обаprofiles и houses таблица. Я также добавил бы поле type, которое может использоваться для определения того, какой из двух типов пользователей.

Это позволяет пользователям иметь либо типа и позволяет им иметь как profile и house.

Так как дома и профили belong_to пользователей и пользователей have_many (или have_one) дома и профили

+0

Yep У меня было ощущение полиморфный не было правильным тоже здесь. Я еще очень новичок в Rails. Если у меня есть отношения между таблицами пользователей и профилей (и домами), то, конечно же, мне придется проверять везде, где мне нужно то или другое. Например, даже с полем типа, мне нужно будет проверить, что у пользователя есть дом или профиль, прежде чем я получу его? Разве это не плохо? Кажется немного ... неудобно. –

+0

Я бы не стал беспокоиться об этих деталях. Вы можете использовать области или другие атрибуты для получения моделей, которые вам нужны, когда они вам понадобятся. –

+0

Хорошо. Я постараюсь сначала. –