Как запросить по двум столбцам с самоссылочной связью с SQL / ActiveRecord? - PullRequest
1 голос
/ 03 мая 2011

Итак, у меня есть модель Story и Share. Story принадлежит_ Share, а Share has_one Story. У них обоих есть метки времени. Share является самореферентным, поэтому в нем есть столбец parent_id, и иногда одна часть будет вложена в другую. И это не бесконечно многократно, просто на один уровень ниже.

Изначально я только что сортировал по столбцу created_at в Story. Но теперь мне нужно сделать что-то более сложное. Если у Story есть Share или вложенные акции, я бы тоже хотел отсортировать их по столбцам created_at. Идея заключалась в том, что дальнейшая активность на этом Story (вложенные акции) повысила бы его до вершины ордера.

РЕДАКТИРОВАТЬ: Вот решение:

SELECT * FROM stories
LEFT OUTER JOIN shares AS s1 ON stories.share_id = s1.id
LEFT OUTER JOIN shares AS s2 ON s2.parent_id = s1.id
ORDERY BY s2.created_at DESC NULLS LAST, stories.created_at DESC

Или в ActiveRecord:

Story.joins('LEFT OUTER JOIN shares AS s1 ON stories.share_id = s1.id').
      joins('LEFT OUTER JOIN shares AS s2 ON s2.parent_id = s1.id').
      order('s2.created_at DESC NULLS LAST, stories.created_at DESC')

Спасибо за помощь!

1 Ответ

0 голосов
/ 04 мая 2011

Вы должны присоединиться к Share дважды. В SQL это будет примерно так:

select * from stories
left outer join shares as s1 on s1.story_id=stories.id
left outer join shares as s2 on s1.parent_id=s2.id
order by greatest(s2.updated_at,s1.updated_at,stories.updated_at)

Не знаю, как это сделать в Rails, попробуйте поэкспериментировать с: includes

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...