0

我有一个模型如下:

Campaign
  has_many :companies, :through => :contacts

与同一家公司有很多联系。我只想要每家公司的一个实例。

我尝试了以下方法:

@campaign = Campaign.find(params[:id])
@companies = @campaign.companies

但这向我展示了我相信的每个联系人的所有公司。至少这是输出的样子。

如何确保只添加一个公司实例?

4

2 回答 2

5

当您使用:through时,使用该:uniq选项通常很有用,因此您不会得到重复的结果

has_many :companies, :through => :contacts, :uniq => true
于 2010-08-13T16:30:45.663 回答
1

“j”当前接受的解决方案。起作用,但是效率很低,因为它在 Ruby 中删除了重复项,而不是在 SQL 中。它实际上只是.uniq!在返回的结果上运行。

在我看来,有效且正确的方法是:

has_many :companies, :through => :contacts, :select => "DISTINCT companies.*"

它可能不那么漂亮,但它会得到你想要的,不会使用额外的内存,而且速度会更快。

于 2010-09-23T23:13:16.843 回答