代码之家  ›  专栏  ›  技术社区  ›  mjswartz

在Rails中创建has_and_belongs_to_many关系

  •  1
  • mjswartz  · 技术社区  · 10 年前

    我有一个用户模型,是根据Michael Hartl RoR教程设计的,我正在尝试创建一个新的教师模型。我希望老师有很多用户,但每个用户只有一个老师。我创建了教师模型

    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。老师们来了。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
    

    然而在我的教师考试中。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
    

    但这完全失败了。我的关系设置正确吗?我显然没有正确添加用户,因为模型没有通过有效性测试。我如何向该教师添加更多用户?提前谢谢。

    2 回复  |  直到 10 年前
        1
  •  1
  •   Richard Peck    10 年前

    我希望老师有很多用户,但每个用户只有一个老师

    你只需要 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
    

    您需要添加 teacher_id users 表格(与您现在拥有的相反):

    class UpdateUsers < ActiveRecord::Migration
      def change
        change_table :users do |t|
          t.references :teacher, index: true, foreign_key: true #-> teacher_id
        end
      end
    end
    

    --

    你的错误是你在打电话 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 你已经列出了。

    你还想看看 collection_singular_ids 对于 has_任何 关联,这就是你的测试失败的原因。

        2
  •  1
  •   archana    10 年前

    你的老师。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列。