0

我已经在这个问题上工作了几天,而我看过的其他 Stack Overflow 帖子要么真的很旧,要么不是我需要的。

问题:

涉及三个模型:

旅行- 代表旅行及其相关信息,注意:不包括任何有关机组人员的信息。

里程碑- 表示在一次旅行中采取的行动(就本问题而言,当船员登船或下船时)。

CrewMember - 代表旅行中的单个机组成员,每个机组成员都有一个登船和下船里程碑,如果他们在同一地点登船或下船,则可以与其他船员共享。CrewMembers 通过他们的 board_milestone_id 和 disembark_milestone_id 链接到里程碑。

现在我正在制作一个表单,用户可以在其中编辑旅行中的所有信息,其中包括旅行中出现的船员、他们的角色以及他们在哪里登船/下船。正在编辑行程,因此整个页面都包含在 form_for 构建器中。

编辑 CrewMembers 的页面部分包含在 fields_for 构建器中。Trips 模型被配置为接受 CrewMember 模型的嵌套属性。船员的数量是可变的,每个人都需要单独编辑他们的信息(所以据我所知,我不能使用 select_tags)。这可以很好地在视图中显示机组成员,但当我实际尝试更新时不起作用,因为 CrewMembers 通过 board_milestone_id 和 disembark_milestone_id 与里程碑相关联,而不仅仅是里程碑_id。

问题:

因此,考虑到所有这些,有没有一种方法可以“教”rails 以从一个行程表中的“里程碑”识别 CrewMembers,无论是登船里程碑 id、下船里程碑 id 还是最好两者兼而有之?

我的印象是,这不是“Rails”做这种事情的方式,但我想在转向更混乱的解决方法之前将这个想法发布到社区。

任何意见是极大的赞赏。感谢您的时间。

要求的型号代码:

class CrewMember < ApplicationRecord
  belongs_to :guide
  belongs_to :milestone
end

class Trip < ApplicationRecord
  belongs_to :launch_slot, required: true
  has_many :milestones
  has_many :places, through: :milestones
  has_many :crew_members, through: :milestones, foreign_key: embark_milestone_id

  accepts_nested_attributes_for :milestones
  accepts_nested_attributes_for :crew_members
end

class Milestone < ApplicationRecord
  belongs_to :trip
  belongs_to :place

  has_many :crew_members
end
4

1 回答 1

0

听起来您想要belongs_to从 CrewMember 到 Milestone 的两种关系。您需要为这些关系赋予不同的名称,然后使用class_name选项覆盖默认类名(请参阅文档):

class CrewMember < ApplicationRecord

  belongs_to :guide
  belongs_to :embark_milestone, class_name: :Milestone
  belongs_to :disembark_milestone, class_name: :Milestone

end

然后,您需要从 Milestone 类定义两个has_many与 CrewMember 类的关系。这次您还需要指定foreign_key,因为这也无法推断:

class Milestone < ApplicationRecord

  belongs_to :trip

  has_many :embarking_crew_members, class_name: :CrewMember,
    foreign_key: :embark_milestone_id
  has_many :disembarking_crew_members, class_name: :CrewMember, 
    foreign_key: :disembark_milestone_id

end

您的下一个问题是如何从 Trip 模型中获取 allCrewMembers 的集合。embark_milestone_id您建议您希望返回通过OR连接的任一船员disembark_milestone_id。没有直接的方法可以做到这一点 - 您必须编写自己的方法,将embarking_crew_membersdisembarking_crew_members关系连接在一起,然后删除任何重复项。但是,真的有可能有一个下船但没有上船的船员吗?;-)

于 2017-06-14T12:47:26.973 回答