Dana Scheider
Dana Scheider

Reputation: 419

Rails: Scope parent model by attribute of child

I'm having a tough time figuring something out in Rails. It probably has to do with my very limited knowledge of SQL, since I know Rails pretty well. I'm using Rails 5.

I have two models: Applicant and Application.

class Applicant < ApplicationRecord
  has_one :application
  has_many :skills

  accepts_nested_attributes_for :application
  accepts_nested_attributes_for :skills, 
    reject_if: ->(skill) { skill[:name].empty? || skill[:experience].empty? }

  validates_with ApplicantValidator
 end

class Application < ApplicationRecord
  belongs_to :applicant
  has_many :notes

  VALID_STATUSES = ["in review", "accepted", "declined", "closed"]

  validates_length_of   :why_interested, minimum: 25
  validates             :accept_terms, acceptance: true
  validates             :status, inclusion: { in: VALID_STATUSES }

  before_validation :set_status

  private

  def set_status
    self.status ||= "in review"
  end
end

I'd like to add a scope, :active, to the Applicant model that returns only applicants who have an application whose status is "in review". However, I can't find a way to access the application within a scope proc.

I've seen other suggestions for cases where there is a has_many relationship with the child, but they didn't work in my case.

I doubt it makes a difference, but I'm using Postgres. The closest I've come to a solution is to add this, but when I run RSpec it says there needs to be a FROM-clause for the applications table. I don't know how to effect that.

scope :active, -> { joins(:application).where('"application"."status" = "in review"') }

Upvotes: 1

Views: 1687

Answers (1)

scope :in_review_applicants, -> { joins(:application).where('application.status = ?', :in_review) }

I think is something like that..

Upvotes: 1

Related Questions