2017-10-14 2 views
0

transaction_recordworkflows이 많고, 각 workflow은 많은 milestones입니다. milestones 중 하나는 current: true를 표시하고, 나는 transaction_recordcurrent_milestone받는 사람에서 가고 싶은 : 내가 원하는 milestone 반환하는 방법을 만들 수 있습니다레일 has_one : through 다른 모델명

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 

,하지만 난 그렇게 그것을 실제 연결을 내가 할 수 만들고 싶어 DB 성능을 위해 포함하십시오.

저는 페이지를 가지고 있습니다. 여기에서 나는 각각 transaction_recordscurrent_milestone을 나열합니다. 이걸 알아낼 수 없다면 n+1입니다.

는 정말 같은 것을 할 수 있어야합니다 :

@transaction_records = TransactionRecord.includes(:current_milestone) 

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

갱신 내가 transaction_recordmilestone 사이의 방향 관계를 지정할 수 있습니다

을 다음 transaction_record has_one :current_milestone, -> { where(current: true) }, class_name: Milestone을한다. 하지만 지금은보다 효율적인로드 쿼리를 위해 DB 스키마를 변경하고 있습니다. 이미 세계가 끝난 것이 아니라 내 선호도가 아닙니다.

답변

0

솔직히 말해서 transaction_record에는 current_workflow에 대한 언급없이 active_milestone과 같은 개념이 있습니다.

좋은 솔루션은 다음 current 할 수있는 능력을 가지고 workflowmilestone 모두에 대해 생각하는 것입니다

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

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

이 나를 위해 훨씬 더입니다,하지만 당신은 여전히 ​​workflow에 추가 current 플래그 속성을 추가 할 필요가 .

그래서 더 나은 솔루션은 개념을 전혀 재 작업하는 것입니다. 을 중요 시점에서 제거하고 워크 플로에 current_milestone_id을 추가하십시오. 값이 0이면이 workflowcurrent_milestone이 없습니다. ID가 포함되어 있으면 current_workflowcurrent_milestone_id입니다.

코드는 꽤 똑같아 보이지만, 추한 상태는 아닙니다. Workflow