Как определить связь в модели рельсов, где у модели есть внешние ключи, которые ссылаются на статические значения в другой таблице

У меня есть пользовательские объекты, которым необходимо ссылаться на статические значения в сторонних таблицах. У пользователей есть выбор моды и выбор еды. Таблицы выбора моды и еды - это просто список строк, соответствующих идентификатору. Хранение значений в отдельном файле (CSV, JSON) не подходит для моего бизнес-кейса.

Я определил собственный метод:

def fashion_choice
  FashionChoice.find_by(id: self.fashion_choice_id)
end

Что работает нормально, но дает мне проблему N + 1, потому что я не могу использовать includes в своих запросах ActiveRecord из-за того, что ассоциация определяется в настраиваемом методе.

Я знаю, что могу использовать что-то вроде own_to в пользовательской модели, чтобы сообщить rails, что ключ находится в таблице Users, но странно говорить, что User принадлежит к выбору моды. Есть ли лучший способ сделать это, или мне просто нужно сделать это идиоматическим способом Rails?

Таблица пользователей:

id name fashion_choice_id food_choice_id

Таблица FashionChoice:

id name
1  Halloween
2  Holiday
3  Beach Santa

Таблица FoodChoice аналогична.

Пожалуйста, разместите здесь оба контроллера.

Mayur Shah 31.10.2018 13:24

Контроллеров нет, код строго в моделях.

JapanRob 31.10.2018 13:38

Хорошо. Делайте это одно, def fashion_choice self.fashion_choices end. И да, нет необходимости добавлять новый метод в модель. Просто используйте карту, чтобы получить запись связанной модели, это не вызовет другого запроса.

Mayur Shah 31.10.2018 13:39

Я не хочу критиковать, но использование self.fashion_choices не сработает, потому что отношения не определены в файлах модели, поэтому это приведет к ошибке. Кроме того, если бы я мог вызвать self.fashion_choices, мне бы вообще не понадобился этот метод.

JapanRob 31.10.2018 13:49

Без взаимосвязи Как вы могли бы получить выгоду от ROR? Да, вам не нужны какие-либо методы для получения связанных данных.

Mayur Shah 31.10.2018 13:52
0
5
52
0

Другие вопросы по теме