Задать вопрос
@Nodar
Python, Ruby, JavaScript

Rails 4 many_to_many, как правильно настроить?

Привет! Не могу понять, как настроить отношения в Rails через промежуточную табицу.

Модели
class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  has_and_belongs_to_many :boards, join_table: :boards_users
  has_many :tasks
end

class Board < ActiveRecord::Base
  belongs_to :owner, class_name: "User"
  has_and_belongs_to_many :user, join_table: :boards_users
  has_many :tasks, dependent: :destroy
end


Миграция
class CreateBoardsUsers < ActiveRecord::Migration
  def change
    create_table :boards_users do |t|
    end
  end
end


Как мне добавлять записи в boards_users? Рельсы, как-то сами с этим справятся или нужно ручками что-то прописывать? Я делал модель BoardBoards и пытался делать save, но постоянно вылазит ошибка relation "boards_users" doesn't exist.
  • Вопрос задан
  • 181 просмотр
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
Freika
@Freika
Senior Ruby on Rails developer
А почему у вас таблица пустая создается? В ней должны быть колонки user_id и board_id.
Ответ написан
Комментировать
@chronic86
Ruby on Rails junior
class CreateBoardsUsers < ActiveRecord::Migration
  def change
    create_table :boards_users, id: false do |t|
     t.integer :board_id
     t.integer :user_id
    end
  end
end

Называть миграцию лучше CreateBoardsUsersJoinTable.

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  has_and_belongs_to_many :boards
  has_many :tasks
end

class Board < ActiveRecord::Base
  belongs_to :owner, class_name: "User"
  has_and_belongs_to_many :users
  has_many :tasks, dependent: :destroy
end


Когда пишите has_and_belongs_to_many имя модели во множественном числе. У вас в коде :user

Если есть необходимость можно в join_table добавить индексы:
add_index :boards_users, :board_id
add_index :boards_users, :user_id


Когда исправите свои модели рельсы сами выстроят нужные ассоциации.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы