Преброяване и избор на обект в ActiveRecord с 1 заявка

Имаме обекти, които искаме да представим в стекове (помислете за подреждане на елементи в MMO). Ще има дублирани редове.

Да приемем, че нашата таблица owned_objects изглежда така.

user_id | object_id
1       | 27
1       | 27
3       | 46
3       | 46
5       | 59

Искам да направя заявката

SELECT
  user_id,
  object_id,
  count(*) AS count
FROM owned_objects
GROUP BY
  user_id,
  object_id;

И върнете или 3-те отделни OwnedObjects (или дори само получаването на отделните Objects също би свършило работа) и броя, свързан с него.

Знам, че това е възможно с SQLAlchemy, но можете ли да го направите с ActiveRecord?


person mikelikespie    schedule 27.10.2009    source източник


Отговори (2)


Какво ще кажеш …

@objects = user.objects.all(:select => "count(*) as count, objects.*", :group => :object_id)

… или подобно?

След това можете да извлечете броя чрез динамично създаден атрибут на всеки обект:

@object.first.count # the "stack depth" of the first object.

Това предполага или has_and_belongs_to_many :objects, или has_many :objects, :through => :owned_objects за потребителя.

person cwninja    schedule 27.10.2009
comment
Хм, така че опитах това и то връща обектите и изпълнява правилната заявка, но как човек може да извлече броя от това извикване? - person mikelikespie; 27.10.2009
comment
Трябва да е в атрибута #count на съответните обекти. - person cwninja; 27.10.2009
comment
Не мислете, че това работи, защото отражението не вижда колона, наречена count. Под #count имате предвид само метода на класа, count, правилно? - person mikelikespie; 27.10.2009
comment
Не, броят трябва да се дефинира динамично като атрибут на всеки върнат обект. ActiveRecord може да бъде толкова умен. - person cwninja; 28.10.2009
comment
Работи за мен - успях да настроя обхват на модел M с scope :foo, self.select("count(*) as count, object_id").group(:object_id) и след това можех да използвам с @foo = M.foo и достъп до @foo.count и foo.object_id - person mm2001; 05.05.2012

Намерих a решение, но не съм сигурен дали е най-чистото (дано не е).

По принцип създадох SQL изглед, който изпълнява тази заявка, и създадох модел за нея. Има плъгин за rails, който разпознава изгледи за миграции.

person mikelikespie    schedule 27.10.2009