Rails 3 - has_and_belongs_to_many - PullRequest
       16

Rails 3 - has_and_belongs_to_many

1 голос
/ 30 марта 2012

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

Похоже, я что-то не так делаю:

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>'

Что не так?

Ответы [ 3 ]

3 голосов
/ 30 марта 2012

Во-первых, создание таблицы в миграции не определяет вашу модель.Вы должны создать модель 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
1 голос
/ 30 марта 2012

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

Подробнее здесь: Выбор между has_many: through и has_and_belongs_to_many

0 голосов
/ 30 марта 2012

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

атрибуты будут похожи на эту таблицу

subject_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
...