Add a `merge_request_diff_id` column to `merge_requests`
Problem
At the moment, we have these relations on MergeRequest
:
has_many :merge_request_diffs
has_one :merge_request_diff,
-> { order('merge_request_diffs.id DESC') }, inverse_of: :merge_request
That means to get the latest diff, we just get the last by ID. This is fine when querying for an individual MR and its latest diff, but much more painful to get the latest diff for a bunch of MRs at once, and query performance is not good: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/13713#note_39263395
Proposal
How about adding to merge_request_diff_id
to merge_requests
?
And then I think following scope returns only expected merge_requests (not OUTDATED).
class MergeRequest
...
scope :by_commit_sha, ->(sha) { joins(:merge_request_diff).merge(MergeRequestDiff.by_commit_sha(sha)) }
Discarded proposal
We could consider adding a latest
column, which would work like this. When we add a merge_request_diff
, we update all existing MR diffs for that MR to latest: false
, and set our new one to latest: true
. This will make it much easier to query for.