2012-08-15 2 views
3

를 조회 할 가상 필드를 추가, 나는이 다음을 작성했습니다 결과. sqlite에서 쿼리를 실행하면 표시됩니다. Address 모델에 가상 속성을 추가했지만 이것이 도움이되지 않습니다. 이 문제를 해결하는 방법? 또한 어떻게 성능을 향상시키기 위해 결과

이 내 레일 콘솔 출력 :

1.9.3p194 :010 > a = Address.joins(:vacancies).select("addresses.city, count(*) as total_count").group("addresses.city").order("total_count DESC") 
    Address Load (3.9ms) SELECT addresses.city, count(*) as total_count FROM "addresses" INNER JOIN "vacancies" ON "vacancies"."address_id" = "addresses"."id" GROUP BY addresses.city ORDER BY total_count DESC 
=> [#<Address city: "Amsterdam">, #<Address city: "Rotterdam">, #<Address city: "Utrecht">, #<Address city: "Den haag">, #<Address city: "Delft">, #<Address city: "Hilversum">, #<Address city: "Amstelveen">, #<Address city: "Rijswijk">, #<Address city: "Breda">, #<Address city: "Zwolle">, #<Address city: "Tilburg">, #<Address city: "Amersfoort">, #<Address city: "Amsterdam centrum">, #<Address city: "Eindhoven">, #<Address city: "Next nature netwerk, amsterdam">, #<Address city: "Almere">, #<Address city: "Ameide">, #<Address city: "Arnhem">, #<Address city: "Baarlo">, #<Address city: "Capelle a/d ijssel">, #<Address city: "De lier">, #<Address city: "Leiden">, #<Address city: "Reigerstraat 16, breda">, #<Address city: "Rottedam">, #<Address city: "'s-hertogenbosch ">, #<Address city: "Alkmaar">, #<Address city: "Alphen aan den rijn">, #<Address city: "Amsterdam singel 137">, #<Address city: "Amsterdam, keizergracht">, #<Address city: "Barendrecht">, #<Address city: "Den haag e.o.">, #<Address city: "Deventer">, #<Address city: "Dordrecht">, #<Address city: "Groningen">, #<Address city: "Gummo, amsterdam">, #<Address city: "Hillversum">, #<Address city: "Houten">, #<Address city: "Lisse">, #<Address city: "Moti, breda">, #<Address city: "Nijmegen">, #<Address city: "Rotterdam ">, #<Address city: "Tuil (waardenburg)">, #<Address city: "Zaltbommel">] 
1.9.3p194 :011 > a.first.total_count 
=> nil 
1.9.3p194 :012 > a.first.to_json 
=> "{\"city\":\"Amsterdam\",\"total_count\":null}" 

답변

5

먼저 가상 속성 (모델에 attr_accessor :total_count이 있다는 의미으로 가정)을 제거하십시오.

활성 레코드의 inspect 방법 (콘솔에서 출력을 생성하는 방법)은 예상되는 attrbutes에 대한 정보 (예 : 테이블의 실제 열에 해당하는 정보) 만 표시하도록 하드 연결됩니다. select 절에 무언가를 추가했기 때문에 존재하는 속성은 표시되지 않습니다. 그들은 여전히있다 - 당신이

a.first.total_count 

또는

a.first.attributes 

이 그것을보고 할 수 있습니다. 콘솔 세션에서 attr_accessor이 데이터베이스 속성을 섀도 잉하기 때문에 a.first.total_count이 작동하지 않습니다.

to_json 메서드는 기본적으로 비슷하게 알려진 특성을 serialize합니다.

a.to_json(:methods => [:total_count]) 
+0

attr_accessible에서 total_count를 제거했지만, 여전히 'a.first.total_count'를 통해 총 수에 액세스 할 수 없습니다. 작동하는 것은'a.first.attributes [ 'total_count']'입니다. 'to_json'을 사용하라는 제안은 모든 total_count 속성이 nill 인 json 객체를 반환합니다.attr_accessible 또는 attr_accessor/attr_reader/attr_writer의 –

+0

? 이런 맥락에서 두 번째로 많은 것이 나쁘다. –

+0

오, 물론 그렇습니다. Tnx, 그 트릭을 했어!. –

2

조회 : 첫 번째 요소의

@result = Address.joins(:vacancies).select("addresses.city, count(*) as total_count").group("addresses.city").order("total_count DESC") 

총 수 :

@result.first.total_count 

당신이 할 수없는 경우 콘솔의 total_count 속성을 참조하십시오.

@result.first.to_json 

은 모든 속성을 표시합니다.

팁 : 너무 많은 인용 부호를 사용하고 있으며 속성이 하나의 테이블에만 존재하는 경우 테이블 이름에 속성 접두어를 붙일 필요가 없습니다. 조인은 성능을 향상시키지 않습니다. 성능 향상을 원할 경우 eager loading

+0

나는이 경우에 약간의 성능 향상이있을 것이라고 생각합니다. 편집을 참조하십시오. 그럼에도 불구하고 나는 당신의 제안이 매우 도움이된다는 것을 안다. 결과는 여전히 내가 기대하는 바가 아니지만 잘못된 점을 알기 전에 좀 더 놀아야합니다. –

+0

추가 편집을 참조하십시오. 콘솔 출력을 추가하여 상황을 설명합니다. –

관련 문제