0

Atransaction_record有很多workflows,每个workflow都有很多milestones。其中一个milestones已标记current: true,我想从transaction_recordcurrent_milestone

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

我可以创建一个返回所需的方法milestone,但我想让它成为一个实际的关联,以便我可以将它包含在数据库性能中。

我有一个transaction_records#index页面,我在其中列出了每个的transaction_records和。除非我能弄清楚这一点current_milestonen+1

我真的希望能够做类似的事情:

@transaction_records = TransactionRecord.includes(:current_milestone)

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

更新

transaction_record我可以指定和之间的方向关系milestone,然后做transaction_record has_one :current_milestone, -> { where(current: true) }, class_name: Milestone。但现在我正在更改我的数据库模式以获得更有效的负载查询。不是世界末日,但如果我已经有一个协会,这不是我的偏好。

4

1 回答 1

0

老实说,我不喜欢这个概念,它transaction_record有某种 active_milestone 而没有提及 join current_workflow

好的解决方案是考虑两者workflowmilestone有能力成为current然后:

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

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

这对我来说要好得多,但是您仍然需要currentworkflow.

这就是为什么更好的解决方案是彻底改造你的概念。current从里程碑中删除并添加到current_milestone_id工作流。如果它是 nil,那么它workflow没有current_milestone. 如果它包含一些 id,那么这是你的current_workflowand current_milestone_id

代码看起来几乎一样,但它不会有丑陋的条件Workflow

于 2017-10-14T00:40:36.033 回答