has_many: through: uniq отношение должно собрать все из сквозной таблицы - PullRequest
3 голосов
/ 03 ноября 2011

Вот проблема, которую трудно объяснить. Итак, вот пример. Допустим, у меня есть это в модели:

has_many :things,
  :through => :relationships,
  :source  => :thing

Мне нужно получить список things и все данные, которые у меня есть в таблице relationships. Допустим, это «отношения. Имя». Мы можем сделать это так:

has_many :things,
  :through => :relationships,
  :source  => :thing,
  :select  => 'things.*, relationships.name as rel_name'

Так что, если есть 2 отношения, я верну 2 объекта:

 #<Thing id: 1, rel_name: "foo">
 #<Thing id: 1, rel_name: "bar">

Если мы добавим :unique => true или настроим select для использования DISTINCT, мы получим уникальные объекты, но данные об одном из отношений исчезнут. Что я действительно хочу, так это уникальные things со всеми различными именами отношений, собранными в аксессор:

 #<Thing id: 1, rel_names: ["foo", "bar"] >

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

Спасибо

Ответы [ 2 ]

1 голос
/ 03 ноября 2011

с использованием GROUP_CONCAT на MySQL:

class MyModel < ActiveRecord::Base
  attr_accessor :rel_names

  has_many :things,
    :through => :relationships,
    :source  => :thing,
    :select  => 'things.*, GROUP_CONCAT(DISTINCT relationships.name SEPARATOR ";;") as rel_names'


  # .. your code ..

  def rel_names
    @rel_names.present? ? @rel_names.split(';;') : []
  end
end
1 голос
/ 03 ноября 2011

MySQL имеет метод GROUP_CONCAT () для такого рода вещей:

 has_many :things,
   :through => :relationships,
   :source  => :thing,
   :select  => 'things.*, GROUP_CONCAT(relationships.name as rel_name)'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...