Проблема отношения многих ко многим - PullRequest
0 голосов
/ 02 февраля 2020

У меня есть две модели пользователя и лотереи, имеющие отношение многих ко многим через таблицу мостов. Имя класса Lotteries_Users LotteriesUser.

Вот эти модели:

user.rb

class User < ApplicationRecord
  has_many :lotteries_users, class_name: "LotteriesUser"
  has_many :lotteries, through: :lotteries_users
end

lottery.rb

class Lottery < ApplicationRecord
    has_many :lotteries_users, class_name: "LotteriesUser"
    has_many :users, through: :lotteries_users
end

Lotteries_User Модель: lotteries_user.rb

class LotteriesUser < ApplicationRecord
  belongs_to :users
  belongs_to :lotteries
end

Я пытался использовать имена классов после отношения has_many, но оно все еще не работает. Я получаю сообщение об ошибке NoMethodError (неопределенный метод `Relations_delegate_class 'для пользователей: модуль) на консоли рельсов Lottery.first.users

и NoMethodError ( неопределенный метод `last 'для #) на консоли rails User.first.lotteries

1 Ответ

3 голосов
/ 02 февраля 2020

Просто назовите вашу модель и таблицу в соответствии с соглашениями, и все это будет просто нажать:

class User < ApplicationRecord
  has_many :lottery_users
  has_many :lotteries, through: :lottery_users
end

# table should be named lottery_users
class LotteryUser < ApplicationRecord
  belongs_to :user # should be singular
  belongs_to :lottery # should be singular
end

class Lottery < ApplicationRecord
  has_many :lottery_users
  has_many :users, through: :lottery_users
end

Неправильное именование может вызвать много проблем, так как Rails будет искать Lotteries::User, если таблица названа lotteries_users. При получении имен классов из имен таблиц предполагается, что множественные слова являются пространствами имен.

Соглашение для моделей объединения - SingularSingular, если на самом деле нет чего-то более различительного, например, Ticket или Entry.

...