2013-10-28 2 views
0

Каков правильный способ сделать многие для многих в Rails?Как сделать много для многих отношений в Rails?

Я потратил немного времени на тонкости этого, поэтому я подумал, что поставил бы вопрос и ответ здесь, в случае, если он кого-то еще кого-нибудь спасет.

+0

проверить этот документ http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_and_belongs_to_many –

ответ

0

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

Итак, во-первых, с Rails для новых Rails. Когда вы создаете модель, например «Story», генератор будет умножать модель при создании имени таблицы для базы данных, например «истории». Так, например, когда я запускал «рельсы g model author_book», модель заканчивается названием «BookBook», а рельсы именуют таблицу author_books.

Помните об этом при выборе имен моделей, поскольку первоначально «История» была названа «Новости», что нарушило соглашение о рельсах с моделями, названными в единственной форме.

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

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

приложение/модели/book.rb

class Book < ActiveRecord::Base 
    attr_accessible :title 
    has_many :author_books  #This is the database table name!! 
    has_many :authors, through: #This is the database table name!! 
end 

приложение/модели/author.rb

class Author < ActiveRecord::Base 
    attr_accessible :name 
    has_many :author_books     #This is the database table name!! 
    has_many :books, through: :author_books #This is the database table name!! 
end 

приложение/модели /author_book.rb

class AuthorBook < ActiveRecord::Base 
    attr_accessible :author_id, :book_id 
    belongs_to :author       #This is the MODEL name 
    belongs_to :book        #This is the MODEL name 
end 

20131025011112_create_author_books.rb миграция Пример:

class CreateAuthorBooks < ActiveRecord::Migration 
    def change 
    create_table :author_books, :id => false do |t| 
     t.belongs_to :author #this is the MODEL name 
     t.belongs_to :book #this is the MODEL name 
    end 
    add_index :author_books, [:author_id, :book_id], :unique => true #This is the database table name!! 
    end 
end 

Я надеюсь, что спасает кого-то еще некоторое время!

+0

Не нужно объявлять 'AuthorBook' как отдельную модель. Просто убедитесь, что таблица базы данных названа правильно, как вы уже сделали, и объявите взаимосвязь, описанную в http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association, чтобы она be 'has_and_belongs_to_many: books' for' Author' –

+0

Этот QA совершенно не нужен, тема покрыта большой длиной при минимальном поиске. – Matt

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