[英]Creating a has_and_belongs_to_many relationship in Rails
我有一個根據Michael Hartl RoR教程設計的用戶模型,我正在嘗試創建一個新的Teacher模型。 我希望老師有很多用戶,但每個用戶只有一個老師。 我創建了教師模型
class CreateTeachers < ActiveRecord::Migration
def change
create_table :teachers do |t|
t.string :name
t.string :email
t.string :phone
t.references :user, index: true, foreign_key: true
t.timestamps null: false
end
end
end
並將has_one :teacher
添加到user.rb。 這是Teachers.rb模型
class Teacher < ActiveRecord::Base
has_and_belongs_to_many :users
validates :user_id, presence: true
before_save :downcase_email
validates :name, presence: true,
length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
validates :email, presence: true,
length: { maximum: 255 },
format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
private
# Converts email to all lower-case.
def downcase_email
self.email = email.downcase
end
end
但是在我的Teacher_test.rb測試文件中,情況變得有些模糊。 我嘗試這個
def setup
@user = users(:michael)
@user2 = users(:archer)
@user3 = users(:lana)
@user4 = users(:mallory)
@teacher = Teacher.new(name: "Phred Willard",
email: "pwillard@test.com",
phone: "1234567890",
user_id: [@user.id,
@user2.id,
@user3.id,
@user4.id])
end
test "should be valid" do
assert @uac.valid?
end
但這徹底失敗了。 我的關系設置正確嗎? 由於模型未通過有效性測試,因此我顯然沒有正確添加用戶。 我如何向該老師添加更多用戶? 提前致謝。
您的Teacher.rb應該是
class Teacher < ActiveRecord::Base
has_many :users
before_save :downcase_email
validates :name, presence: true,
length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
validates :email, presence: true,
length: { maximum: 255 },
format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
private
# Converts email to all lower-case.
def downcase_email
self.email = email.downcase
end
end
和user.rb
class User < ActiveRecord::Base
belongs_to :teacher
# rest of your code here ....
end
您需要在用戶表中的Teacher_id列。
我希望老師有很多用戶,但每個用戶只有一個老師
您只需要has_many
/ belongs_to
...
#app/models/user.rb
class User < ActiveRecord::Base
belongs_to :teacher
end
#app/models/teacher.rb
class Teacher < ActiveRecord::Base
has_many :users
end
您需要在users
表中添加一個teacher_id
列(與您現在的相反):
class UpdateUsers < ActiveRecord::Migration
def change
change_table :users do |t|
t.references :teacher, index: true, foreign_key: true #-> teacher_id
end
end
end
-
您遇到的錯誤是您正在對teacher
調用user_id
; 該用戶的名稱應為teacher_id
:
@teacher = Teacher.new(name: "Phred Willard",
email: "pwillard@test.com",
phone: "1234567890",
user_ids: [@user.id,
@user2.id,
@user3.id,
@user4.id])
這應該將@teacher
與您列出的已定義@users
關聯。
您還需要查看has_many
關聯的collection_singular_ids
,這就是測試失敗的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.