Как я могу просто получить одну запись вместо дубликатов, используя ActiveRecord в Rails?

У меня есть модель следующим образом:

Campaign
  has_many :companies, :through => :contacts

Есть много контактов с одной и той же компанией. Мне просто нужен один экземпляр каждой компании.

Я пробовал следующее:

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

Но это показывает мне все компании для каждого контакта, которому я верю. По крайней мере, так выглядит вывод.

Как я могу убедиться, что добавляется только один экземпляр компании?


person Satchel    schedule 13.08.2010    source источник


Ответы (2)


Когда вы используете :through, обычно полезно использовать параметр :uniq, чтобы не получать повторяющиеся результаты.

has_many :companies, :through => :contacts, :uniq => true
person Ju Nogueira    schedule 13.08.2010

В настоящее время принятое решение "j." будет работать, однако это очень неэффективно, поскольку дубликаты удаляются в Ruby, а не в SQL. На самом деле он просто запускает .uniq! для возвращенных результатов.

Эффективный и, на мой взгляд, правильный способ сделать это:

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

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

person Bo Jeanes    schedule 23.09.2010