简体   繁体   English

防止此Post模型的实例出现两次(Rails)?

[英]Preventing instances of this Post model from appearing twice (Rails)?

I have a Post model: 我有一个Post模型:

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

a Tag model: 标签模型:

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

and a User model: 用户模型:

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

In the index page users only see posts with tags they have subscribed to: 在索引页面中,用户只能看到他们订阅了标签的帖子:

posts_controller.rb: posts_controller.rb:

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

Now say there is a post with the tags food and drinks , and the user has subscribed to these two tags. 现在说有一个标签fooddrinks的帖子,用户订阅了这两个标签。 He will see the post twice; 他会两次看到这个帖子; it seems like it is appearing once as a post tagged as food and then as a post tagged as drinks . 似乎它作为一个标记为food的帖子出现一次,然后作为标记为drinks的帖子出现。

Is there a way of preventing posts like this from appearing twice? 有没有办法防止这样的帖子出现两次?

Add :uniq => true as a parameter to the has_many in the User model: 添加:uniq => true作为User模型中has_many的参数:

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

The docs at http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many-label-Options says: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many-label-Options上的文档说:

:uniq :uniq的

If true, duplicates will be omitted from the collection. 如果为true,则将从集合中省略重复项。 Useful in conjunction with :through. 与以下内容结合使用:通过。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM