Rails: как отсортировать отношение «многие ко многим»

У меня есть отношение многие ко многим между модельным пользователем и изображением. Они связаны таблицей соединений, называемой Picturiization.

Если я получу список пользователей одной картинки, то есть picture.users - & gt; как я могу убедиться, что полученный результат отсортирован путем создания строки Picturizing (то есть порядка, в котором изображение было связано с пользователем). Как бы это изменилось, если бы я хотел получить это в порядке модификации?

Спасибо!

Edit Может быть что-то вроде

<code>picture.users.where(:order => "created_at")
</code>
but this created_at refers to the created_at in picturization

Ответы на вопрос(3)

picture.users.order("picturizations.created_at DESC")

Есть дополнительный столбец, похожий напоследовательност в таблице фотоизображений и определите порядок сортировки в качестве области по умолчанию в своем фотоизображении

default_scope :order => 'sequence ASC'

Если вы хотите порядок сортировки по умолчанию на основеified_at, используйте следующую область по умолчанию

default_scope :order => 'modified_at DESC'
 Firoz Ansari02 мая 2012 г., 19:24
Если вы хотите, чтобы в качестве последовательности был выбран столбецified_at, то вы можете это сделат
 Karan02 мая 2012 г., 18:51
Я заметил, что у изображения уже есть созданный_каталог и измененный_элемент в столбцах таблицы (по умолчанию?). Могу ли я использовать это как-то?

в моем случае мне нужно отсортировать отношение «многие ко многим» по столбцу с именем weight в средней таблице. После нескольких часов попыток я нашел два решения для сортировать отношения многие ко многим.

Solution1: в Rails Way
picture.users.where(:order => "created_at")

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

Я пытался переписать метод default_scope в Picturizing, но он не работает:

def self.default_scope
  return Picturization.all.order(weight: :desc)
end  

Вместо этого сначала нужно получить идентификаторы отсортированного изображения:

ids = Picturization.where(user_id:user.id).order(created_at: :desc).ids

Затем вы можете получить отсортированные объекты, используя MySQL field functin

picture.users.order("field(picturizations.id, #{ids.join(",")})")

который генерирует SQL выглядит следующим образом:

SELECT `users`.* 
FROM `pictures` INNER JOIN `picturizations` 
ON `pictures`.`id` = `picturizations`.`picture_id` 
WHERE `picturizations`.`user_id = 1#for instance 
ORDER BY field(picturizations.id, 9,18,6,8,7)#for instance
Solution2: в сыром виде SQL

Вы можете получить ответ напрямую, используяСортировать п функция:

SELECT `users`.* 
FROM `pictures` INNER JOIN `picturizations` 
ON `pictures`.`id` = `picturizations`.`picture_id` 
WHERE `picturizations`.`user_id = 1

order by picturizations.created_at desc

Ваш ответ на вопрос