簡體   English   中英

在Rails中創建has_and_belongs_to_many關系

[英]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.

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