Является ли это правильный способ настройки имеет много с несколькими ассоциациями? - PullRequest
0 голосов
/ 23 апреля 2010

Я пытаюсь создать новый проект для музыкального сайта. Я изучаю ROR и немного озадачен тем, как создавать объединяющие модели / таблицы. Это выглядит правильно?

У меня есть пользователи, плейлисты, песни и комментарии. Пользователи могут иметь несколько плейлистов. Пользователи могут иметь несколько комментариев в своем профиле. Плейлисты могут иметь несколько песен. Плейлисты могут иметь комментарии. Песни могут иметь комментарии.

class CreateTables < ActiveRecord::Migration
  def self.up

    create_table :users do |t|
      t.string :login
      t.string :email
      t.string :firstname
      t.string :lastname
      t.timestamps
    end

    create_table :playlists do |t|
      t.string :title
      t.text :description
      t.timestamps
    end

    create_table :songs do |t|
      t.string :title
      t.string :artist
      t.string :album
      t.integer :duration
      t.string :image
      t.string :source
      t.timestamps
    end

    create_table :comments do |t|
      t.string :title
      t.text :body
      t.timestamps
    end

    create_table :users_playlists do |t|
      t.integer :user_id
      t.integer :playlist_id
      t.timestamps
    end    

    create_table :playlists_songs do |t|
      t.integer :playlist_id
      t.integer :song_id
      t.integer :position
      t.timestamps
    end

    create_table :users_comments do |t|
      t.integer :user_id
      t.integer :comment_id
      t.timestamps
    end

    create_table :playlists_comments do |t|
      t.integer :playlist_id
      t.integer :comment_id
      t.timestamps
    end

    create_table :songs_comments do |t|
      t.integer :song_id
      t.integer :comment_id
      t.timestamps
    end

  end

  def self.down
    drop_table :users
    drop_table :playlists
    drop_table :songs
    drop_table :comments
    drop_table :users_playlists
    drop_table :users_comments
    drop_table :playlists_comments
    drop_table :songs_comments
  end
end

Ответы [ 2 ]

1 голос
/ 23 апреля 2010

Мало вещей:

Короткая версия:

  1. Соединяемые таблицы должны быть в алфавитном порядке (например, create_table :comments_users
  2. Thisэто только половина настройки ваших ассоциаций. Мне бы тоже хотелось увидеть код вашей модели
  3. Ваша модель комментариев должна быть настроена так, чтобы быть полиморфной ассоциацией с другими.

Длинная версия:

  1. При настройке таблицы соединений (например, пользователей и комментариев) вы хотите сделать ее алфавитной. Чтобы таблица пользователей / комментариев была на самом деле create_table :comments_users. В идеале вы хотели бычтобы установить более значимое имя для этой таблицы соединений (поскольку это модель - см. ниже), но это ваш вызов.
  2. Помните, что вам нужно создавать модели для этих :has_many through ассоциаций. Большинство из этих таблиц объединенияможет быть создан с помощью :has_and_belongs_to_many, но для будущих расширений может также использоваться метод :has_many through. Было бы разумно также указать код ассоциации в файлах модели - так же важно, как и создание таблиц.
  3. Для коммНет, подумайте о полиморфных отношениях.Это потому, что комментарии одинаковы для всех таблиц, к которым он принадлежит.То, что это делает, ищет столбец типа в таблице полиморфного соединения, и это говорит ему, к какой таблице принадлежит запись (т.е. комментарий).

Начальные ресурсы:

Посмотрите на бриллиант Райана (как обычно) Railscast по теме:
http://railscasts.com/episodes/47-two-many-to-many

Также, по полиморфизму:
http://railscasts.com/episodes/154-polymorphic-association

http://guides.rubyonrails.org/association_basics.html

0 голосов
/ 23 апреля 2010

Это выглядит хорошо. Кажется, у вас есть идентификаторы во всех нужных местах.

Пара очков, хотя:

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

У вас есть несколько тестов, верно? :)

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