How do i select an association record that has yet to be saved in Rails?

127 Views Asked by At

I have the following models and relationships. I'm building a form and am wanting to initialize terms of the proposal for the form. How can I select a specific ProposalTerm by it's term_type_id to pass on to my fields_for block?

Proposal

class Proposal < ApplicationRecord
  after_initialize :add_terms

  has_many :terms, class_name: "ProposalTerm", dependent: :destroy

  accepts_nested_attributes_for :terms

  def add_terms
    terms << ProposalTerm.first_or_initialize(type: TermType.signing_bonus)
  end
end

ProposalTerm

class ProposalTerm < ApplicationRecord
  include DisableInheritance

  belongs_to :proposal
  belongs_to :type, class_name: "TermType", foreign_key: "term_type_id"

  def self.signing_bonus
    find_by(type: TermType.signing_bonus)
  end

end

My Attempt

>> @proposal.terms
=> #<ActiveRecord::Associations::CollectionProxy [#<ProposalTerm id: nil, season: nil, value: nil, is_guaranteed: false, term_type_id: 2, proposal_id: nil, created_at: nil, updated_at: nil>]>
>> @proposal.terms.where(term_type_id: 2)
=> #<ActiveRecord::AssociationRelation []>
1

There are 1 best solutions below

0
daveomcd On

I was able to figure out an answer. I had tried "select" but I was doing it incorrectly.

I had tried the following,

@proposal.terms.select(term_type_id: 2)

but that wasn't returning anything. I then did the following...

@proposal.terms.select { |t| t.term_type_id = 2 }

If you want to return just the first instance use "detect" ...

@proposal.terms.detect { |t| t.term_type_id = 2 } }