2011-10-27 4 views
0

내가 해시의 배열을 불렀다 메시지 :Ruby에서 주어진 수의 관련 객체로 인스턴스를 찾는 방법은 무엇입니까?

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 

가 어떻게 메시지의 특정 번호를 가진 제품을 찾을 수 있습니까? 예 : 이다

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

; : 1 제품을 줄 것> 메시지로 제품을 찾을 수 "3"

+0

당신이 제품 (들) 또는 실제 개체에 대한 바로 ID를 찾고 계십니까? 즉 제품 ID 또는 Product.find (3)가있는 배열 만 [ "3"]? –

+0

그게 바로 Product.find (3)와 같은 실제 객체가 필요합니다. – PEF

답변

2

제품 별 메시지를 그룹화하고 둘 이상의 메시지가있는 제품을 선택하십시오.

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

당신은 DB에서 제품의 인스턴스를 검색 할 경우 는 액티브 방법을 사용 :

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

+0

아 39 초 만에 나를 때려. 나는 당신의 적시성에 따라 연기합니다. – pguardiario

+0

OK 그리고 실제 제품을 가져와야하는 경우 작동합니까? 'Product.each {| prod | prod.messages.group_by (| m | m [ 'product']). {p, mList | mList.length()> 1} .keys()}' – PEF

0

내 초기 생각은 다음과 같다 제품 번호의 배열을 추출하고 중복을 제거하십시오. 그런 다음 해당 배열에서 어레이에 두 번 이상 나타나는 숫자를 선택하십시오.

관련 문제