Предотвращение появления экземпляров этой модели Post дважды (Rails)? - PullRequest
0 голосов
/ 14 марта 2012

У меня есть Сообщение модель:

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 Метка Модель:

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

На странице индекса пользователи видят только сообщения с тегами, на которые они подписаны:

posts_controller.rb:

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

Теперь скажите, что есть сообщение с тегами food и drinks, и пользователь подписался на эти два тега.Он увидит почту дважды;кажется, что он появляется один раз как сообщение, помеченное как food, а затем как сообщение, помеченное как drinks.

Есть ли способ предотвратить появление таких сообщений дважды?

1 Ответ

2 голосов
/ 14 марта 2012

Добавьте :uniq => true в качестве параметра к has_many в модели User:

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

Документы на http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many-label-Options говорят:

: Uniq

Если true, дубликаты будут исключены из коллекции. полезным в сочетании с: через.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...