Как найти экземпляры с заданным количеством связанных объектов в Ruby? - PullRequest
0 голосов
/ 27 октября 2011

У меня есть массив хэшей, называемых сообщениями:

messages = [{ "id" => "1", "name" => "John", "content" => "xxxxx", "product" => "1" },
 { "id" => "2", "name" => "John", "content" => "yyyyy", "product" => "3" },
 { "id" => "3", "name" => "Paul", "content" => "zzzzzz", "product" => "3" },
 { "id" => "4", "name" => "George", "content" => "xxyyzz", "product" => "2" }]

Сообщения принадлежат продукту:

class Message < ActiveRecord::Base   
  belongs_to :product
end

Как мне найти товары с заданным количеством сообщений? например найти продукты с сообщениями> 1 даст продукт "3"

Ответы [ 2 ]

2 голосов
/ 27 октября 2011

Группируйте сообщения по продуктам и выбирайте продукты, содержащие более одного сообщения.

messages.group_by(|m| m['product']).select{|p, mList| mList.length() > 1}.keys()

Если вы хотите получить экземпляры Product из БД, используйте методы ActiveRecord:

Product.joins(:messages).group("id").having("count(*) > 1")

0 голосов
/ 27 октября 2011

Моя первоначальная мысль такова:

prod_ids = messages.map{|m| m["product"]}.uniq
prod_ids.select {|prod| prod_ids.count(prod) > 1}

То есть;Извлечь массив номеров продуктов, удалить дубликаты.Затем выберите из этого массива те числа, которые встречаются в массиве более одного раза.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...