2016-01-07 2 views
1

У меня есть модель User, разработанная после учебника Michael Hartl RoR, и я пытаюсь создать новую модель Учителя. Я хотел бы, чтобы у учителя было много пользователей, но у каждого пользователя был только один учитель. Я создал модель учителя сСоздание отношений has_and_belongs_to_many в Rails

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+\-.][email protected][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: "[email protected]", 
         phone: "1234567890", 
         user_id: [@user.id, 
            @user2.id, 
            @user3.id, 
            @user4.id]) 
end 

test "should be valid" do 
    assert @uac.valid? 
end 

но это не работает. Правильно ли я установил свои отношения? Я, очевидно, не добавляю пользователей правильно, так как модель не проходит проверку на достоверность. Как я могу добавить к этому учителю больше пользователей? Заранее спасибо.

ответ

1

Я хотел бы учителю иметь много пользователей, но каждый пользователь должен иметь только один учитель

Вам нужно только 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; она должна быть teacher_id на пользователя:

@teacher = Teacher.new(name: "Phred Willard", 
        email: "[email protected]", 
        phone: "1234567890", 
        user_ids: [@user.id, 
           @user2.id, 
           @user3.id, 
           @user4.id]) 

Это должно связать @teacher с определенной @users вы в списке.

Вы также захотите посмотреть на collection_singular_ids для ассоциации has_many, поэтому ваш тест терпит неудачу.

+0

Удивительный! Спасибо (еще раз). Если у меня есть новый пользовательский аккаунт, и они хотят выбрать существующего учителя, как бы я это сделал в контроллере? Я представляю себе что-то вроде '@teacher = Teacher.find (params [: teacher_id])', а затем '@ teacher.user_ids.add (params [: user_id])', но я сомневаюсь, что это правильно. Я не уверен, как добавить к списку в Rails. – mjswartz

+0

'@teacher.users << User.find (params [: user_id]) ' –

+0

http: // stackoverflow.com/a/7297369/1143732 –

1

Ваш 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+\-.][email protected][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 столбец в таблице пользователей.

+0

Я внес эти изменения, но тест на достоверность по-прежнему не удается. Я думаю, что я не знаю, как добавить нескольких пользователей к одному учителю. Любая помощь там? – mjswartz

+0

Ну, вы не создаете пользователей для учителя в своем модульном тесте. Что такое 'UnitAdvancementChair' в вашем тесте? – archana

+0

Упс, скопируйте и вставьте неправильный файл. Обновленный вопрос с правильным кодом, который я пробовал. – mjswartz

 Смежные вопросы

  • Нет связанных вопросов^_^