Вопрос:

Rails присоединяются к отношению has_many, но также хотят получить результаты без отношений

ruby-on-rails activerecord

51 просмотра

1 ответ

43 Репутация автора

Я не уверен в наилучшем подходе для достижения следующего:

У нас есть пользователи, принадлежащие к стране. Тогда у нас есть несколько категорий, которые могут быть расположены по-разному для каждой страны.

Я хочу получить массив со всеми категориями и их позицией для данной страны (порядок по category_position.position, затем category.name). Я также хочу, чтобы в список были включены категории, в которые не добавлено category_position.

У меня есть следующая структура:

class Country < ApplicationRecord

  has_many :category_position

class Category < ApplicationRecord

  has_many :category_position

class CategoryPosition < ApplicationRecord
  attr_accessible :country_id, :position, :category_id

  belongs_to :country
  belongs_to :category

Я пытался с помощью

categories = Category.joins(:category_position)
        .where("category_positions.country_id = #{user.country.id}")

Что дает мне все категории, которые имеют добавленную позицию для страны пользователя. Как я могу получить тот же список, но также со всеми категориями, для которых не добавлена ​​позиция для страны пользователя?

В идеале этот список должен быть упорядочен по позиции (1,2,3), затем по имени (если равные позиции) и в конце списка категорий без позиций.

Автор: peroseth Источник Размещён: 08.11.2017 11:32

Ответы (1)


2 плюса

1141 Репутация автора

Я не проверял это, но я думаю, что вы должны использовать левое внешнее соединение, а также скорректировать предложение where

для рельсов 5

categories = Category.left_outer_joins(:category_position)
                     .where("category_positions.country_id = #{user.country.id} or category_positions.country_id is NULL")

для Rails 4 и ранее

categories = Category.joins("left outer join category_positions on category_positions.category_id = categories.id")
                     .where("category_positions.country_id = #{user.country.id} or category_positions.country_id is NULL")
Автор: Norly Canarias Размещён: 09.11.2017 12:02
Вопросы из категории :
32x32