Rails has_many通过has_and_belongs_to_many

时间:2018-02-09 13:45:00

标签: ruby-on-rails ruby has-and-belongs-to-many has-many-polymorphs

我正在尝试通过辅助模型找到从has_and_belongs_to_many关联获取数据的方法。我现在会说抱歉,因为我可能不会解释这一点,所以最好我只是展示协会和我需要做的事情。我正在使用Rails 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

App / Incidents Join Table:

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

2 个答案:

答案 0 :(得分:0)

您可以使用uniq_by

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

然后你可以做

@my_service.incidents.uniq_by(&:incident_id)

答案 1 :(得分:0)

incidents添加到您的Service

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

然后

@service.incidents.uniq

OR

@service.incidents.distinct

这应该做。