Rails:具有多个嵌套关联的集合的collection_select

Rails: collection_select with a collection of multiple nested associations

提问人:Jens Schmidt 提问时间:12/1/2019 更新时间:12/1/2019 访问量:29

问:

我对此一无所知: 我有一个表单,您可以在其中选择服务端口正在侦听的 IP 地址。

<%= form.collection_select(:listener_id, Ipaddress.all, :id, :ipv4address, {include_blank: t("ports.select")}, { class: "form-control" }) %>

给定以下模型:

  • 客户拥有许多系统
    • 系统具有许多网络接口
      • 网络接口具有多个 IP 地址
    • 系统有许多服务
      • 服务有许多端口

我想将“端口”与“IP地址”连接。如您所见,在我的collection_select中,我创建了所有 IP 地址的集合。甚至来自其他系统或其他客户的。这不是我想要的。

在另一种情况下,我可以做这样的事情:,但我现在找不到一种方法来做我的收藏。我想列出该系统上或客户所有系统上所有可能的 IP 地址。Customer.find(System.find(@networkinterface.system.id).customer_id).systems.all

有人可以减轻我的负担吗?什么是最简单的,最好的方法是什么?

Ruby-On-Rails 集合 关联

评论


答:

0赞 max 12/1/2019 #1

您要在此处执行的操作是设置间接关联,以便遍历树:

class Customer
  has_many :systems
  has_many :networkinterfaces, though: :systems
  has_many :ipaddresses, through: :networkinterfaces
end

class Networkinterface
  belongs_to :system
  has_one :customer, through: :system
end

给定客户,您只需使用间接关联来获取 IP 地址列表。@customer

<%= form.collection_select(:listener_id, @customer.ipaddresses, :id, :ipv4address, {include_blank: t("ports.select")}, { class: "form-control" }) %>

评论

0赞 max 12/1/2019
您还应该根据 Ruby 样式指南重命名您的类和关联。NetworkInterface -> network_interface。IPAdress -> ip_address。您的代码是要读取的 PITA。
0赞 Jens Schmidt 12/1/2019
谢谢你。成功了。不知何故,这有点明显。也感谢您对我的命名约定的建议。老实说,我有点担心复数化和其他东西在这样的名称中不能使用下划线。这就是为什么我认为我这样保持它更安全。返工可能会做很多工作。但我将来会牢记这一点。
0赞 max 12/2/2019
只需创建迁移以重命名表,然后只需使用搜索和替换来更改名称即可。这真的不是那么多工作。您必须为 IPAddress 设置一个变形,但这非常简单。