この質問は、STI化で起きた障害に関わる質問の、別の解決アプローチに関するものです。
復数のIssueそれぞれに(復数の)Userが復数のMessageをつけることができます。
Message belongs_to issue, belongs_to user
Issue has_many messages,
ですが IssueとUserとは関連つけられて居ません。
ここで、
あるUserがつけたMessageの中でIssuer毎に一番最後のMessage(のid)を集める のをどうやるか、ということなのですが。
こういう式が作られていました
select('max(id) as id').from(where(user_id: user.id)) .group(:issue_id).map(&:id)
「Messageの中からUserが作ったものだけ抜き出して temp table」を作り、それを対象に Issueでまとめる という意図と思います。
これと
select('max(id) as id').where(user_id: user.id) .group(:issue_id).map(&:id)
で得られるものに違いが有るでしょうか。違いが有る可能性が有るでしょうか。
group と where の評価順に自信が無くなってしまって、後者でよいと言い切るのが不安。。
各々のSQLは次の様になりました。(type='IssueMessage' はSTIの関係で追加されています。)
前者
SELECT max(id) as id
FROM (SELECT 'issue_messages'.* FROM 'issue_messages' WHERE 'issue_messages'.'type' = 'IssueMessage' AND 'issue_messages'.'user_id' = 1)
subquery WHERE 'issue_messages'.'type' = 'IssueMessage' GROUP BY 'issue_id'
後者
SELECT max(id) as id FROM 'issue_messages' WHERE 'issue_messages'.'type' = 'IssueMessage' AND 'issue_messages'.'user_id' = 1
GROUP BY 'issue_messages'.'issue_id'
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/14 10:15
2021/04/14 12:53