2010-04-14 3 views
1

태그라고하는 Ruby on Rails 응용 프로그램에서 테이블을 만들었습니다. 블로그 응용 프로그램이므로 사용자가 태그를 게시물과 연결하고 posts, : has_many => 태그 및 태그 belongs_to : post association을 통해이 작업을 수행 할 수 있습니다.테이블에서 유사한 레코드를 찾고 개수를 표시하는 방법 - Ruby on Rails

이제 태그 테이블이 생겨 태그와 태그 수가 표시되도록 뷰를 렌더링하는 방법을 보여줍니다. (나는 /views/posts/index.html.erb 파일에서 이것을 렌더링하려하고있다.)

예를 들어 tag_name Sports에 대한 태그 테이블에 10 개의 항목이있는 경우. 보기에서 Sports (10)를 어떻게 표시 할 수 있습니까? 나는 특정 태그를 위해 이것을하는 것이 아니라 오히려, 어떻게 든 테이블을 검색하고, 태그와 같이 결합하고, 모든 태그의 목록을 그 옆에 셀 수와 함께 표시한다. (나는이 태그가 그 태그를 포함하는 게시물 목록에 대한 링크가되기를 정말로 원하지만 한 번에 한 가지 질문 만하기 위해 조기에 배웠다.)

희망이 있습니다. 코멘트

보기위한

UPDATE

<% @tag_counts.each do |tag_name, tag_count| %> 
    <tr> 
     <td><%= link_to(tag_name, posts_path(:tag_name => tag_name)) %> </td> 
     <td>(<%=tag_count%>)</td> 
    </tr> 
<% end %> 

가 PostsController :

def index 
    @tag_counts = Tag.count(:group => :tag_name) 
    @posts = Post.all :order => "created_at DESC" 



    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @posts } 
     format.json { render :json => @posts } 
     format.atom 
    end 
    end 

답변

4

다음을 수행하십시오 : 당신이를 추가하면

Tag.count(:group => :name).each do |tag_name, tag_count| 
    puts "tag_name=#{tag_name}, tag_count=#{tag_count}" 
end 

당신은 성능이 향상 될 수 있습니다 name 열의 인덱스는 tags 테이블에 있습니다. 태그 이름을 표시

설정 @tag_counts 뷰와 관련된 컨트롤러 액션에서 : 컨트롤러 방법에

이 카운트 해시를 설정합니다

는 다음을 수행 태그 이름과 관련된 게시물을 표시하려면 . 뷰 쇼에서

@tag_counts = Tag.count(:group => :tag_name) 

링크로 각 태그 : 당신의 PostsController의 인덱스 방법

<% @tag_counts.each do |tag_name, tag_count| %> 
    <%= link_to(tag_name, posts_path(:tag_name => tag_name)) %> (<%=tag_count%>) 
<% end %> 

링크를 가리 킵니다. 각 링크에는 tag_name 매개 변수가 있습니다. PostsControllerindex 방법에서

:

class PostsController < ApplicationController 
    def index 
    @tag_counts = Tag.count(:group => :tag_name) 
    conditions, joins = {}, nil 
    unless (params[:tag_name] || "").empty? 
     conditions = ["tags.tag_name = ? ", params[:tag_name]] 
     joins = :tags 
    end 
    @posts=Post.all(:joins => joins, :conditions => conditions) 
    end 
end 

편집tag_namename 필드를 변경하는 코드를 업데이트했습니다.

+0

이것은 바보 같은 질문이 될 수도 있지만 모습 이것은 태그 컨트롤러에서 카운트를 정의하는 데 사용할 코드입니다. 이 경우보기에서 어떻게 렌더링합니까? <% = h (tag.count) %>? – bgadoci

+1

답변을 업데이트했습니다. 보세요. –

+0

이봐,이 일을 할 시간을 내 주셔서 고마워. 나는 내일 첫번째 일을 조사 할 것이다. 다시 한 번 정말로 감사드립니다. – bgadoci

0

먼저 - 귀하의 연관성을 잘못 알고있는 것처럼 보입니다. 태그와 포스트는 일대 다 관계가 아닌 다 대다 관계입니다.

acts_as_taggable 구현 중 하나를 살펴 보는 것이 좋습니다.그렇지 않으면 원하는 경우 has_many :through 연결을 생성 할 수 있지만 이것이 바퀴를 재발 명하는 것입니다.

모든 페이지로드에 대한 콜렉션에서 count()을 호출하면 매우 좋지 않은 아이디어입니다. 그러면 모든 태그에 대해 데이터베이스에 도달하게됩니다. 규모면에서 매우 비싼 작업. 또한 주어진 태그가있는 게시물 수는 요청시 계산해야하는 숫자가 아니므로이 방법은 비용이 많이 들고 불필요합니다.

레일즈에는 counter_cache이라는 내장 기능이 있습니다.이 기능은 정수 필드의 관련 레코드 수를 캐싱하고 새 레코드가 생성 될 때마다 업데이트합니다. 여기 당신이 그것을 설정하는 방법은 다음과 같습니다

def up 
    add_column :tags, :taggings_count, :integer, :default => 0 

    Tag.reset_column_information 
    Tag.all.each do |t| 
    Tag.update_counters t.id, :taggings_count => t.taggings.length 
    end 
end 

def down 
    remove_column :tags, :taggings_count 
end 

그리고 belongs_to 연결을 변경 :

가에 대한 마이그레이션을 만들기 tags 테이블

class Tagging < ActionRecord::Base 
    belongs_to :tag, :counter_cache => true 
    belongs_to :post 
end 

당신이 당신의 자신의 태그 시스템을 구축하는 경우 다음과 같이 나머지 두 모델을 연결합니다.

class Post < ActiveRecord::Base 
    has_many :taggings 
    has_many :tags, :through => :taggings 
end 

class Tag < ActiveRecord::Base 
    has_many :taggings 
    has_many :posts, :through => :taggings 
end 

부 다시 말하면 미리 만들어진 솔루션을 사용하는 것이 훨씬 쉬울 것입니다. 지금부터

, 당신은 Tagging 모델을 통해 Tag에 새로운 Post 연결을 만들 때마다 자동으로 당신을 위해 taggings_count 열을 업데이트합니다. 다른 열처럼 반복하는 동안 귀하의 의견에

, 당신은 카운트를 표시 할 수 있습니다

<%= link_to "#{tag.name} (#{tag.taggings_count})", posts_path(:tag_name => tag.name) %> 

일부 추가 읽기 :
ActiveRecord has_many :through associations
ActiveRecord association basics (:counter_cache discussed in section 4.1.2.4)