Ruby on rails 在Rails中创建一个has_和_-allown_-to_-many关系

Ruby on rails 在Rails中创建一个has_和_-allown_-to_-many关系,ruby-on-rails,has-many,Ruby On Rails,Has Many,我有一个用户模型,它是在Michael Hartl RoR教程之后设计的,我正在尝试创建一个新的教师模型。我希望教师有许多用户,但每个用户只有一个教师。我创建了教师模型 class CreateTeachers < ActiveRecord::Migration def change create_table :teachers do |t| t.string :name t.string :email t.string :phone

我有一个用户模型,它是在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
然而,在我的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

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

你的老师.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
用户表中需要教师id列

我希望教师有许多用户,但每个用户只有一个教师

你只需要

-

您所犯的错误是,您正在调用教师的用户id;它应该是用户的教师id:

这应该将@teacher与您列出的已定义的@users相关联


您还需要查看has\u many关联,这就是您的测试失败的原因。

我做了这些更改,但有效性测试仍然失败。我想是因为我不知道如何将多个用户添加到一个教师中。有什么帮助吗?好吧,你不是在单元测试中为老师创建用户。在你的测试中什么是UnitAdvancementChair?哦,从错误的文件中复制和粘贴。用我试过的正确代码更新了问题。太棒了!再次感谢你。如果我有一个新用户注册,他们想选择一个现有的教师,我将如何在控制器中这样做?我想象一下像@teacher=teacher.findparams[:teacher\u id]然后是@teacher.user\u id.addparams[:user\u id],但我怀疑这是否正确。我不知道如何附加到Rails中的列表中。检查用户是否有教师怎么样?它会被@user.teacher访问吗?您可以在用户模型validates:teacher,presence:true中使用验证,或者您可以使用类似@user.has\u teacher的东西?并在模型中将其定义为def已指定的教师?老师,你现在在吗?恩迪加上了老师?在用户模型中定义,但在测试它时,我没有得到预期的结果。我试着用just assert@user.has\u teacher进行测试@用户来自我的原始问题中看到的设置,但该断言失败。知道为什么吗?
class User < ActiveRecord::Base
  belongs_to :teacher
  # rest of your code here ....
end
#app/models/user.rb
class User < ActiveRecord::Base
   belongs_to :teacher
end

#app/models/teacher.rb
class Teacher < ActiveRecord::Base
   has_many :users
end
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 = Teacher.new(name: "Phred Willard",
                     email: "pwillard@test.com",
                     phone: "1234567890",
                     user_ids: [@user.id, 
                               @user2.id,
                               @user3.id,
                               @user4.id])