2009-08-06 4 views
4

나는 date_published를 포함하는 포스트 모델을 가지고 있습니다. 특정 연도의 모든 게시물을 볼 수있는 색인 페이지의 링크를 표시하고 싶습니다. (블로그에서 몇 달 동안 볼 수있는 블로그가있는 곳과 비슷합니다.)년별 레일 문제 그룹

내가 몇 년을 돌아가고 있다고 생각할 수있는 유일한 방법은 전체를 반복하는 것입니다. 게시물이 들어가고 게시물이 들어가는 고유 한 배열을 반환합니다. 그러나 이것은 먼 길처럼 보입니다. 누구는 이것에 더 나은 해결책이 있습니까? 어쩌면 포스트가 새 테이블을 만드는 것이 더 쉬울 수도 있습니다. 연도

제안 사항?

답변

4

나는이 중 하나를 사용하십시오하십시오 find_by_sql

  • 을 별개의 년을 얻기 위해, 올해 계시 기능은 데이터베이스에서 사용할 수있는 무엇이든 사용. 아마 당신이 가질 것으로 기대했던 인덱스에 대해 해결할 것입니다.

또는

    Post.minimum(:date_published).year..Post.maximum(:date_published).year

  • 나는 그것이 년에는 게시물이 없습니다 수있는 가능성을 고려하지 않더라도, 두 번째 많이 좋아!

  • +0

    네, 두 번째 옵션에 대해 많이 생각했습니다. 여전히 최선의 일이라면 숙고해야합니다. 감사합니다 – Cameron

    3

    [{"updated_at"=>"2009"}, {"updated_at"=>"2008"}, {"updated_at"=>"1979"}, {"updated_at"=>"1922"}] 
    
    years.each { |y| puts y['updated_at'] } 
    2009 
    2008 
    1979 
    1924 
    
    9

    시작할 필요가 없습니다

    years = ActiveRecord::Base.connection.select_all("SELECT DISTINCT DATE_FORMAT(updated_at, '%Y') AS updated_at FROM posts ORDER BY updated_at DESC") 
    

    이는 형태로 일년 값을 반환합니다 (내 예제는 updated_at가) 날짜 시간 필드의 SQL 검색을 사용 루비 코드에서 모든 것을 반복 할 수 있습니다.

    >> Post.count(:all, :group => "Year(date_published)") 
    => [["2005", 5], ["2006", 231], ["2007", 810], ["2009", 3]] 
    

    을 그리고 그에서 링크를 구축 : 당신은 count으로 :group 옵션을 사용할 수 있습니다.

    +0

    그게 전부 멋지다. 시도해 볼 수도 있습니다. – Cameron

    +0

    SQLlite의 경우 구문은'Post.count (: all, : group => "strftime ('% Y', date_published)")'입니다. 불행히도, MySQL에서는 작동하지 않습니다. – berkes