#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. пожалуйста, проверьте мой пост, также я обновил его, это тоже было бы полезно