Rails has_many через has_and_belongs_to_many

Я пытаюсь найти способ получить данные из ассоциации has_and_belongs_to_many через вторичную модель. Сейчас я извиняюсь, так как я могу не объяснить это правильно, поэтому лучше всего я просто покажу ассоциации и то, что мне нужно сделать. Я использую Рельсы 5.

У меня есть:

Модель инцидента:

incident has_and_belongs_to_many :apps

Модель приложений:

app has_and_belongs_to_many :incidents

app belongs_to :service

Модель обслуживания:

has_many :apps

Что я хочу найти для моего сервиса, так это то, в какие Инциденты он был вовлечен через имеющиеся у него приложения, но мне нужны только уникальные Инциденты.

Есть ли способ сделать @service.apps_incidents.unique и получить список уникальных инцидентов.

Мои миграции выглядят так:

Сервисная таблица:

class CreateServices < ActiveRecord::Migration[5.1]
  def change
    create_table :services do |t|
      t.string :name
      t.timestamps
    end
  end
end

Таблица приложений:

class CreateApps < ActiveRecord::Migration[5.1]
  def change
    create_table :apps do |t|
      t.string :name
      t.references :service, foreign_key: true
      t.timestamps
    end
  end
end

Таблица происшествий:

class CreateIncidents < ActiveRecord::Migration[5.1]
  def change
    create_table :incidents do |t|
      t.string :name
      t.timestamps
    end
  end
end

Приложение/инциденты присоединиться к таблице:

class CreateJoinTableAppsIncidents < ActiveRecord::Migration[5.1]
  def change
    create_join_table :apps, :incidents do |t|
      t.index [:incident_id, :app_id]
    end
  end
end

person Phil    schedule 09.02.2018    source источник


Ответы (2)


Вы можете использовать uniq_by

class Service
  has_many :apps
  has_many :incidents, through: :apps
end

Затем вы можете сделать

@my_service.incidents.uniq_by(&:incident_id)
person SteveTurczyn    schedule 09.02.2018
comment
Спасибо, я знал, что это должно быть просто, над размышлениями в пятницу. Я получил сообщение об ошибке выше: NoMethodError (undefined method uniq_by' для #‹Incident::ActiveRecord_Associations_CollectionProxy:0x0000559ad7a8a8a0›)`, но когда я запускаю: @my_service.incidents.distinct.pluck(:incident_id), я получаю правильный результат - person Phil; 09.02.2018

Добавьте incidents к Service

class Service
  has_many :apps
  has_many :incidents, through: :apps
end

потом

@service.incidents.uniq

OR

@service.incidents.distinct

Это должно сработать.

person Sandip Mane    schedule 04.03.2020