Rails: collection_select с коллекцией нескольких вложенных ассоциаций - PullRequest
0 голосов
/ 01 декабря 2019

Я ничего не понимаю в этом: у меня есть форма, в которой вы можете выбрать, какой IP-адрес прослушивает порт службы.

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

Учитывая следующую модель:

  • У клиента много систем
    • В системе много сетевых интерфейсов
      • У сетевого интерфейса много IP-адресов
    • В системе много служб
      • Служба имеет много портов

Я хочу соединить «Порты» с «IP-адресом». Как вы можете видеть, в моем collection_select я создаю коллекцию всех IP-адресов. Даже из других систем или других клиентов. Я не хочу этого.

В другом случае я мог бы сделать что-то вроде: Customer.find(System.find(@networkinterface.system.id).customer_id).systems.all, но я не могу найти способ, как я мог бы сейчас сделать мою Коллекцию. Я хочу составить список всех возможных IP-адресов в этой системе или из всей системы клиента.

Может ли кто-нибудь меня осветить? Что было бы самым простым и как лучше всего это сделать?

1 Ответ

0 голосов
/ 01 декабря 2019

Здесь вы хотите настроить косвенные ассоциации , которые позволят вам пройти по дереву:

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

Для клиента @customer вы можете просто использовать косвенную связь, чтобы получитьсписок IP-адресов.

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