2017-10-14 12 views
0

A transaction_recordは多くがworkflowsであり、workflowは多くがmilestonesです。 milestonesの一つはcurrent: trueにマークされ、私はtransaction_recordcurrent_milestoneにから行きたい:私は希望milestone返すメソッドを作成することができますRails 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_recordmilestone間の方向関係を指定し、[transaction_record has_one :current_milestone, -> { where(current: true) }, class_name: Milestoneを行うことができます

@transaction_records = TransactionRecord.includes(:current_milestone) 

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

更新

を。しかし、今私はより効率的なロードクエリのために自分の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を削除し、current_milestone_idをワークフローに追加します。それが無ければ、workflowにはcurrent_milestoneがありません。 IDが含まれている場合は、current_workflowcurrent_milestone_idです。

コードはかなり同じですが、醜い状態ではありません。Workflow

関連する問題