Skip to content

Instantly share code, notes, and snippets.

@hopsoft
Last active May 15, 2018 14:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hopsoft/a52aabf7bd1d3dde6eba61886d1ad922 to your computer and use it in GitHub Desktop.
Save hopsoft/a52aabf7bd1d3dde6eba61886d1ad922 to your computer and use it in GitHub Desktop.
Arel subquery condition
class AssignableJob < ApplicationRecord
has_many :assignments, as: :record, dependent: :destroy
scope :assigned, -> do
subquery = Assignment.where(record_type: name).where(Assignment.arel_table[:record_id].eq(arel_table[:id])).select(Assignment.arel_table[Arel.star].count)
where "(#{subquery.to_sql}) > 0" # TODO: move to Arel & remove string interpolation
end
end
class Assignment < ApplicationRecord
belongs_to :record, polymorphic: true
end
@danshultz
Copy link

danshultz commented May 15, 2018

What is this model? Is it a polymorphic relationship?

Rails should handle this...

class Foo < ActiveRecord::Base
  has_many :assignments, polymorphic: true
  
  scope :assigned, -> { assignments.any? }
end

@danshultz
Copy link

danshultz commented May 15, 2018

...wait, you are looking for any that are assigned...let me retry that...

class Foo < ActiveRecord::Base
  has_many :assignments, polymorphic: true
  # this _should_ work
  scope :assigned, -> { joins(:assignments) }
  # but this is similar and includes a `where assignments.id is not null` with the join.
  scope :assigned, -> { joins(:assignments).merge(Assignments.where.not(id: nil)) }
end

@hopsoft
Copy link
Author

hopsoft commented May 15, 2018

Thanks for the feedback. Experimenting now... but it appears to be returning duplicate AssignableJob records.

@hopsoft
Copy link
Author

hopsoft commented May 15, 2018

Adding distinct produces what I'm after, but I worry about performance as the table grows.

class AssignableJob < ApplicationRecord
  scope :assigned, -> { joins :assignments }
end
AssignableJob.assigned # returns duplicate records
AssignableJob.assigned.distinct # works

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment