2011-07-15 4 views
7

Я начинаю работать с рубинами на рельсах и пытаюсь понять модели. Довольно знакомы с базами данных и хотели понять, когда создавать модели для отношений?Ruby on Rails - таблицы моделей и отношений

Например, у меня есть таблица таблиц и гаджетов пользователей. Каждый пользователь может иметь несколько гаджетов. Я хочу сохранить это отношение в таблице отношений с user_id и gadget_id. Я создал две таблицы, используя рельсы, генерирующие модель. Пользователь и рельсы генерируют модель Gadget cmd.

Вопрос: Смогу ли я создать еще одну модель под названием users_gadgets? Правильно ли указано соглашение об именах? Я видел много документации о том, как создавать ассоциации (has_many, принадлежит_to), но не понимаю, когда мне нужно создать модель?

Должен ли я создавать модели каждый раз, когда я хочу хранить отношения в базе данных, а затем запускать мои миграции?

ответ

4

вы можете сделать это одним из двух способов

1) has_and_belongs_to_many в этом случае нужна просто таблица (не модели) gadgets_users с user_id gadget_id, рельсы любят имена таблиц, чтобы быть во множественном числе в альфа порядке

2) has_many: через, это не «нормальный» имеет много, в этом случае вам потребуется модель (можно назвать как угодно) я предпочитаю это один над другим, поскольку она позволяет при необходимости добавить дополнительные атрибуты в связь

смотрите руководство, это делает путь лучше, объясняющий, чем я могу http://guides.rubyonrails.org/association_basics.html#choosing-between-has_many-through-and-has_and_belongs_to_many

также - Railscasts - http://railscasts.com/episodes/47-two-many-to-many

Должен ли я создавать модели каждый раз, когда я хочу, чтобы сохранить отношения в базе данных а затем запустить мои миграции? Да, большую часть времени

+0

Благодаря house9! Чтобы дать вам еще какой-то контекст, я привык работать непосредственно в mysql, создавая таблицы, а затем записывая свой код. Поэтому настройка модели немного запутанна. Для # 1 я просто создаю таблицу непосредственно в mysql? – countdrak

+0

@coutdark Я думаю, вам лучше использовать миграции, которые могут помочь создать таблицы очень легко. – PeterWong

1

Я считаю, что самый полезный способ подумать об этом - подумать о моделях, связанных с логикой вашего приложения, и таблицами, относящимися к данным. Так скажите, например, ваш пользователь имеет имя и высоту и вес. Это атрибуты пользователя и хранятся в таблице. Они доступны через атрибуты модели. Но у пользователя может также быть индекс массы тела, рассчитанный по высоте и весу. Это метод модели, но он косвенно связан только с базой данных.

Лично я всегда создавал бы модель для таблицы базы данных. Это проще сделать, упрощает запись чистого рубинового кода без большого количества операторов SQL, и если в какой-то момент в будущем вы захотите добавить логику к модели, это легко сделать.

+0

Спасибо, это очень полезно! – countdrak

5

Модель отношения имеет смысл только для отношений N-to-N, как вы ее описали. Когда вы решите использовать has_and_belongs_to_many, вам не нужно создавать модель соединения, но вам все равно придется создать таблицу соединений через миграцию. Соглашение об именах - это gadgets_users, потому что 'g' находится перед 'u' в алфавите.

Если вы выбрали has_many: через, вы можете сохранить дополнительную информацию в таблице соединений с помощью модели объединения GadgetUser. Например, если вы хотите записать, что гаджет принадлежал пользователю в течение заданного времени, тогда информация в этом случае логически относится к «соединению» между гаджетом и пользователем, поэтому вы должны хранить его в таблице соединений.

+0

Спасибо, это очень полезно! – countdrak

0

Установить камень установить иностранец

надстройку следующие строки в файл гем

камень 'Иностранец'

после этого обзора следующую ссылку

https://github.com/matthuhiggins/foreigner

+0

Если возможно, попробуйте включить резюме любых внешних ссылок, которые вы ссылаетесь. Это так, что если в будущем ссылка замирает, по крайней мере, какая-то полезная информация сохраняется, и это не все потеряно. – niemiro

Смежные вопросы