2011-09-27 1 views
-1

나는 계절이라는 열이있는 Donations라는 테이블이 있습니다. 시즌에는 기부가 이루어진 실제 시즌이 포함되어 있습니다 ... 2011 또는 2010 등과 같습니다.컨트롤러에 모델에 연결되어 있지 않은 고유 한 값의 배열을 얻으려면 어떻게해야합니까?

기부 테이블에서 계절별로 고유 한 목록을 전달하려는 ReportController라는 컨트롤러도 있습니다.

ReportController에서 이러한 고유 값의 배열을 얻으려면 어떻게해야합니까? 내 reportcontroller에서 사용하는 @valid_seasons = Donations.find(:all).unique{|x| x.season}과 같은 것이 있습니까? 그러면 views/report/foo.html.erb 파일에서 select 문에 대한 옵션으로 @valid_seasons를 전달할 수 있습니까?

답변

1

당신은 uniq_by

Donations.all.uniq_by{|x| x.season} 

그러나이 여전히 테이블에 select *을 실행 할 수 있습니다.

raw sql을 사용하는 것이 더 나을 것입니다. 예 :

Donations.find_by_sql("SELECT * FROM donations GROUP BY season") 

첫 번째 예는 모든 레코드를 검색 한 다음 필터링합니다. 두 번째는 고유 한 계절마다 첫 번째 행을 가져옵니다.

+0

음을 ... 그래서 실제로는 약간의 계절 만있을 것이기 때문에 계절에 따라 별개의 테이블을 만들고 그 테이블을보고 계절이 가능한지 알아 보는 것이 가장 좋습니다. 그런 다음 season_id를 기부 테이블에 넣고 새 시즌에 기부가 만들어지면 계절 기록 테이블에 자동으로 새 레코드를 추가하십시오. 그 방법을 사용하는 것이 가장 좋고 완전한 테이블 스캔을하지 않아도됩니까? –

+0

@AaronThomas 내 편집보기. – Gazler

+0

오 ... 할 수 있어요? 멋지다. 그래서 실제로 다음과 같은 일을하고 싶을 것이다.'@valid_seasons = Donations.find_by_sql ("계절별 기부 그룹 선택 시즌")'선택 상자에서 사용할 수있는 계절 만 가져 오기. 사용자가 원하는 계절을 선택할 수 있습니다. 그런 다음 Donation.season_scope (: params [: season]) 또는 뭔가를 사용하여 선택한 계절과 관련된 행만 가져올 수 있습니다. 훌륭해, 고마워! –

1

그래서,이 트릭해야 할 경우, 이것은 레일 3의 경우 언급하지 않지만 :

Donations.select(:season).group(:season) 

이에 의해 적절한 그룹을 실행합니다 :

SELECT season FROM "donations" GROUP BY season 
+0

우. 예, 이것은 레일 3입니다. 나는 그 장면을 줄 것입니다 ...뿐만 아니라, 감사합니다! –

+0

아, 네 ... 그냥 시도하고 꽤 빠릅니다. 이 답변을 받기 전에 나는 여분의 테이블/모델을 만들어 계절에 맞게 작성하고 그 정보를 매우 빠르게 가져 왔습니다 ...하지만 다른 사람이 있으면 테이블에 추가하는 추가 단계를 추가해야합니다. 새로운 계절에 대한 기부금을 만듭니다 (제가 할 수있는 한 피하는 것이 더 낫습니다). 다행히도 Donations.select (: season) .group (: season)은 사용하기에 충분히 수용 할만 큼 빨리 실행되는 것 같습니다. 이제 시즌 표와 season_id 열을 삭제합니다. 고맙습니다! –

+0

이들이 text/varchar 열인 경우 색인을 사용하여 속도를 높여야합니다. – jdeseno

관련 문제