2012-03-14 5 views
0

は私がポストモデルを持っている:このPostモデルのインスタンスが2回(Rails)表示されないようにしますか?

class Post < ActiveRecord::Base  
    belongs_to :user 

    has_many :taggings, :dependent => :destroy 
    has_many :tags, :through => :taggings 

    attr_writer :tag_names 
    after_save :assign_tags 
    before_create :init_sort_column 

    def tag_names 
    @tag_names || tags.map(&:name).join(" ") 
    end 

    private 

    def assign_tags 
    self.tags = [] 
    return if @tag_names.blank? 
    @tag_names.split(" ").each do |name| 
     tag = Tag.find_or_create_by_name(name) 
     self.tags << tag unless tags.include?(tag) 
    end 
    end 
end 

タグモデル:

class Tag < ActiveRecord::Base 
    has_many :taggings, :dependent => :destroy 
    has_many :posts, :through => :taggings 
    has_many :subscriptions 
    #has_many :subscribed_users, :source => :user, :through => :subscriptions 
end 

ユーザーモデル:

class User < ActiveRecord::Base 
    (Code related to Devise) 

    has_many :posts, :dependent => :destroy 
    has_many :subscriptions 
    has_many :subscribed_tags, :source => :tag, :through => :subscriptions 
    has_many :subscribed_posts, :source => :posts, :through => :subscribed_tags 

    attr_writer :subscribed_tag_names 
    after_save :assign_subscribed_tags 

    def subscribed_tag_names 
    @subscribed_tag_names || subscribed_tags.map(&:name).join(' ') 
    end 

    private 

    def assign_subscribed_tags 
    #self.subscribed_tags = [] 
    return if @subscribed_tag_names.blank? 
    @subscribed_tag_names.split(" ").each do |name| 
     subscribed_tag = Tag.find_or_create_by_name(name) 
     self.subscribed_tags << subscribed_tag unless subscribed_tags.include?(subscribed_tag) 
    end 
    end 
end 

インデックスページのユーザーにのみ彼らが購読しているタグ付きの投稿を見るDへ:

posts_controller.rb:

@posts = current_user.subscribed_posts.paginate(:page => params[:page], 
               :per_page => 5, 
               :order => params[:order_by]) 

は、今そこにタグfooddrinksとポストがあり、ユーザは、これら2つのタグに加入していると言います。彼はポストを2回見るでしょう。一度投稿された投稿がfoodと表示され、投稿としてdrinksとタグ付けされているようです。

このような投稿が2回表示されないようにする方法はありますか?

答えて

2

Userモデルにhas_manyにパラメータとして:uniq => trueを追加します。http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many-label-Options

has_many :subscribed_posts, :source => :posts, :through => :subscribed_tags, :uniq => true 

ドキュメントは言う:

:uniqの

trueの場合、重複がされますコレクションから省略されました。有用な と一緒に:through。

+0

ありがとうございました!あなたは私の命を救いました。 – alexchenco

関連する問題