我有一个模型如下:
Campaign
has_many :companies, :through => :contacts
与同一家公司有很多联系。我只想要每家公司的一个实例。
我尝试了以下方法:
@campaign = Campaign.find(params[:id])
@companies = @campaign.companies
但这向我展示了我相信的每个联系人的所有公司。至少这是输出的样子。
如何确保只添加一个公司实例?
我有一个模型如下:
Campaign
has_many :companies, :through => :contacts
与同一家公司有很多联系。我只想要每家公司的一个实例。
我尝试了以下方法:
@campaign = Campaign.find(params[:id])
@companies = @campaign.companies
但这向我展示了我相信的每个联系人的所有公司。至少这是输出的样子。
如何确保只添加一个公司实例?
当您使用:through
时,使用该:uniq
选项通常很有用,因此您不会得到重复的结果
has_many :companies, :through => :contacts, :uniq => true
“j”当前接受的解决方案。会起作用,但是效率很低,因为它在 Ruby 中删除了重复项,而不是在 SQL 中。它实际上只是.uniq!
在返回的结果上运行。
在我看来,有效且正确的方法是:
has_many :companies, :through => :contacts, :select => "DISTINCT companies.*"
它可能不那么漂亮,但它会得到你想要的,不会使用额外的内存,而且速度会更快。