【问题标题】:Ruby on Rails 5: double association between two modelsRuby on Rails 5:两个模型之间的双重关联
【发布时间】:2017-06-13 21:20:05
【问题描述】:

我已经在这个问题上工作了几天,而我看过的其他 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、disembark_milestone_id 或最好两者兼而有之?

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

非常感谢任何建议。感谢您的宝贵时间。

要求的型号代码:

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

【问题讨论】:

  • 你能给我们看看模型代码吗?
  • '在视图中显示机组成员时效果很好,但在我实际尝试更新时不起作用' - 可以向我们展示您的视图以及您目前的更新方式吗?

标签: ruby-on-rails-5 many-to-one fields-for accepts-nested-attributes


【解决方案1】:

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

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_iddisembark_milestone_id 连接的任一船员。没有直接的方法可以做到这一点——您必须编写自己的方法,将 embarking_crew_membersdisembarking_crew_members 关系连接在一起,然后删除所有重复项。但是,真的有可能有一个下船但没有上船的船员吗? ;-)

【讨论】:

    猜你喜欢
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多