Порядок следования рельсов по внешнему ключу (включая nil)

#ruby-on-rails #activerecord

#ruby-on-rails #activerecord

Вопрос:

Я пытаюсь отсортировать столбец, Foo в котором есть один Bar . В настоящее время я использую объединение, чтобы в foos#index действии упорядочиваться по bars.name *:

 @foos = Foo.joins(:bar).order("bars.name")
  

Проблема в том, что не у всех foos есть bar , и кажется, что это соединение игнорирует любое Foo с no Bar . Я не хочу, чтобы эти записи игнорировались. Есть ли способ сделать это?

* Для справки, я использую will_paginate , поэтому index действие фактически включает:

 @foos = Foo.joins(:bar).paginate :page => params[:page], :order => "bars.name"
  

Ответ №1:

Вам нужно использовать SQL LEFT JOIN в вашем joins заявлении. Это приведет к извлечению всех Foos (с Foos, у которых есть столбцы)
Чтобы использовать ‘Rails way’, вы можете включить его в область видимости:

 scope :some_scope_name, joins("LEFT JOIN bars ON foos.id = bars.foo_id")
  

Комментарии:

1. Есть ли ActiveRecord способ сделать это, или мне придется писать прямой SQL?

2. @clem вы можете попробовать это Foo.find(:all, :limit => 10, :joins => "LEFT JOIN foos ON foo.id = bar.id" , ) Это должен быть синтаксис для получения вашего левого соединения вместо внутреннего соединения. Вы также можете использовать синтаксис с .join , нет причин использовать .find .

3. По умолчанию оператор joins использует INNER JOIN. Для других СОЕДИНЕНИЙ вы должны точно указать вид соединения — ЛЕВОЕ или ПРАВОЕ. Пожалуйста, дайте мне знать, помогло ли это вам

4. напишите это: ЛЕВЫЕ СОЕДИНИТЕЛЬНЫЕ полосы На foos.id = bars.foo_id. Исключение с неоднозначным именем столбца возникает, когда в разных таблицах есть несколько столбцов с одинаковым именем, к которым вы хотите присоединиться

5. пожалуйста, проверьте мой пост, также я обновил его, это тоже было бы полезно