簡體   English   中英

Rails 3 - has_and_belongs_to_many

[英]Rails 3 - has_and_belongs_to_many

我有2個模特 - 老師主題 想要通過名稱Qualification連接表連接它們。

看起來我做錯了什么:

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

例如,當我打開rails console並打印時

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

怎么了?

首先,在遷移中創建表不會定義您的模型。 您必須在app/models/qualification.rb創建一個Qualification模型:

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

如果您不打算直接使用連接表,則應該只使用has_and_belongs_to_many 在您的情況下,如果您不打算使用Qualification本身但僅使用Teacher和Subject,並使用Active Record執行臟工作,請使用它。 如果您與連接模型有任何關系,請使用has_many:through。

在這里閱讀更多: 選擇has_many:through和has_and_belongs_to_many

在rails 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM