2017-10-14 2 views
0

A transaction_record hat viele workflows, und jede workflow hat viele milestones. Einer der milestones ist current: true markiert, und ich will von der transaction_record zu dem Thema current_milestone:Schienen has_one: durch mit anderen Modellnamen

class TransactionRecord < ApplicationRecord 
    has_many :workflows 
    has_many :milestones, through: :workflows 

    # DOES NOT WORK, but what I want to do... 
    has_one :current_milestone, through: :workflows, class: Milestone, source: :milestones 

    # Works, but want to make an association for including 
    def current_milestone 
    milestones.where(current: true).first 
    end 
end 

class Workflow < ApplicationRecord 
    belongs_to :transaction_record 
    has_many :milestones 
end 

class Milestone < ApplicationRecord 
    belongs_to :workflow 
end 

ich eine Methode erstellen, die die gewünschte milestone zurückkommt, aber ich will es eine tatsächliche Vereinigung machen, so kann ich Schließen Sie es für die DB-Leistung ein.

Ich habe eine transaction_records#index Seite, wo ich die transaction_records und die current_milestone für jede auflisten. Das ist ein n+1, wenn ich das nicht herausfinden kann.

Ich möchte wirklich in der Lage sein, etwas zu tun wie:

@transaction_records = TransactionRecord.includes(:current_milestone) 

<% @transaction_records.each do |transaction_record| %> 
    <%= transaction_record.name %> - <%= transaction_record.current_milestone.name %> 
<% end %> 

Update

ich eine Richtung Beziehung zwischen transaction_record angeben und milestone und dann transaction_record has_one :current_milestone, -> { where(current: true) }, class_name: Milestone tun. Aber jetzt ändere ich mein DB-Schema für eine effizientere Ladeanfrage. Nicht das Ende der Welt, aber nicht meine Vorliebe, wenn ich schon eine Assoziation habe.

Antwort

0

Um ehrlich zu sein, ich mag nicht das Konzept, dass transaction_record hat eine Art von active_milestone ohne irgendeine Erwähnung über Beitritt current_workflow.

gute Lösung ist sowohl zu denken workflow und milestone eine Fähigkeit zu haben current zu sein, und dann:

class TransactionRecord < ApplicationRecord 
    has_one :current_workflow, .... 
    has_one :current_milestone, through: current_workflow, .... 
end 

class Workflow < ApplicationRecord 
    has_one :current_milestone, condition: .... 
end 

Das ist für mich viel besser ist, aber Sie müssen noch zusätzliche current Flag-Attribut in workflow hinzufügen .

Deshalb ist bessere Lösung Ihr Konzept überhaupt überarbeiten. Entfernen Sie current von Meilenstein und fügen Sie current_milestone_id Workflow hinzu. Wenn es null ist, dann hat dieses workflow keine current_milestone. Wenn es eine ID enthält, dann ist dies Ihre current_workflow und current_milestone_id.

Code sieht ziemlich gleich, aber es wird in Workflow

hässlich Zustand hat nicht
Verwandte Themen