2012-03-30 2 views
1

У меня есть 2 модели - Учитель и Тема. Хотите подключить их через таблицу Join с именем Квалификация.Rails 3 - has_and_belongs_to_many

Похоже, я что-то неправильно:

class Teacher < ActiveRecord::Base 
    has_and_belongs_to_many :subjects, :join_table => "Qualification" 
end 

class Subject < ActiveRecord::Base 
    has_and_belongs_to_many :teachers, :join_table => "Qualification" 
end 

Моя миграция:

class CreateQualificationJoinTable < ActiveRecord::Migration 
    def change 
    create_table :qualification, :id => false do |t| 
     t.integer :subject_id 
     t.integer :teacher_id 
    end 
    add_index :qualification, :subject_id 
    add_index :qualification, :teacher_id 
    end 
end 

Когда я открываю рельсы консоли и печати, например

ruby-1.9.3-head :013 > Qualification 

я получаю это:

NameError: uninitialized constant Qualification 
    from (irb):13 
    from /Users/serg/.rvm/gems/ruby-1.9.3-head/gems/railties-3.2.0/lib/rails/commands/console.rb:47:in `start' 
    from /Users/serg/.rvm/gems/ruby-1.9.3-head/gems/railties-3.2.0/lib/rails/commands/console.rb:8:in `start' 
    from /Users/serg/.rvm/gems/ruby-1.9.3-head/gems/railties-3.2.0/lib/rails/commands.rb:41:in `<top (required)>' 
    from script/rails:6:in `require' 
    from script/rails:6:in `<main>' 

Что не так?

+0

Верь вам нужна модель под названием Квалификационные, переводящий к столу. –

+0

@NekoNova: только если он ExiRe хочет что-то сделать с самой таблицей соединений, иначе пусть AR сделает грязную работу. См. Мой ответ ниже для прикрепленной ссылки. – jipiboily

ответ

3

Во-первых, создание таблицы при миграции не определяет вашу модель. Вы должны создать Qualification модель в app/models/qualification.rb:

class Qualification < ActiveRecord::Base 
    belongs_to :subjects 
    belongs_to :teachers 
end 

Во-вторых, если вы используете Rails 3, выбросить has_and_belongs_to_many и использовать has_many :through:

class Teacher < ActiveRecord::Base 
    has_many :qualifications 
    has_many :subjects, :through => :qualifications 
end 

class Subject < ActiveRecord::Base 
    has_many :qualifications 
    has_many :teachers, :through => :qualifications 
end 
0

В рельсам 3 лучший способ сделать промежуточный таблица квалификации по миграции

атрибуты будут как из этой таблицы

суб ject_id: целое teacher_id: целое

, а также сделать класс квалификации, как этот

class Qualification < ActiveRecord::Base 
    has_many :subjects 
    has_many :teachers 
end 

, а затем определить две другие модели, как

class Teacher < ActiveRecord::Base 
    has_many :qualifications 
    has_many :subjects, :through => :qualifications 
end 

class Subject < ActiveRecord::Base 
    has_many :qualifications 
    has_many :teachers, :through => :qualifications 
end 

и прочитать эту ссылку тщательно также

http://blog.hasmanythrough.com/2007/1/15/basic-rails-association-cardinality 
+1

Я считаю, что в 'Квалификации' вам должно быть' принадлежит_to' вместо 'has_many'. – ExiRe

1

Вы должны использовать только has_and_belongs_to_many, если вы d не намерены работать непосредственно с таблицей соединений. В вашем случае используйте его, если вы не собираетесь использовать квалификацию самостоятельно, а только «Учитель и субъект», и пусть Active Record выполняет грязную работу. Если вы имеете какое-либо отношение к модели объединения, используйте has_many: through.

Подробнее здесь: Choosing Between has_many :through and has_and_belongs_to_many

+0

Спасибо за эту информацию! – ExiRe

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