为什么我对每个具有相同集合名称的帖子都有重复项

时间:2011-10-03 20:37:12

标签: ruby-on-rails-3 views models

您好我有一个帖子模型和一个收藏模型,通过收藏模型连接在一起。当用户发帖时,他将帖子添加到集合中,例如“音乐”。但是,当我列出所有用户的集合时,每个帖子都有多个“音乐”条目而不是1个。 我正在使用@collections = @ user.posts.map(&:collections).flatten抓取集合,如果我在末尾添加.uniq则不会重复(@collections = @ user.posts.map(&) :集合).flatten.uniq)但有人可以解释为什么我必须这样做???非常感谢。

UsersController

  def show
    @user = User.find(params[:id]) rescue nil
    @posts = @user.posts.paginate(:per_page => "10",:page => params[:page])
    @title = @user.name
    @collections = @user.posts.map(&:collections).flatten
  end

的观点/用户/ show.html.erb

 <h1>Collections</h1>

  <% @collections.each do |collection| %>
    <%= link_to collection.name, user_collection_posts_path(@user, link_name(collection)) %><br />
  <% end %>

集合模型

class Collection < ActiveRecord::Base
  mount_uploader :image, CollectionUploader
  attr_accessible :name, :image, :user_id
  has_many :collectionships
  has_many :users, :through => :posts
  has_many :posts, :through => :collectionships
end

收款模型

class Collectionship < ActiveRecord::Base
  belongs_to :post
  belongs_to :collection
  has_one :user, :through => :post
  attr_accessible :post_id, :collection_id
end

发布模型

  belongs_to :user
  has_many :collectionships
  has_many :collections, :through => :collectionships

user mdoel

has_many :posts, :dependent => :destroy
has_many :collections, :through => :posts

1 个答案:

答案 0 :(得分:1)

你已经得到了引起它的那条线。这是我对你为什么看到你所做的事情的看法(只是对该行评估的每一步的扩展):

@user.posts #=>
[
    <Post1:
        id: 1492
        collections: ['history', 'spain']
    >,
    <Post2:
        id: 1912
        collections: ['history', 'shipwrecks']
    >
]

@user.posts.map(&:collections) #=>
[
    ['history', 'spain'],
    ['history', 'shipwrecks']
]

@user.posts.map(&:collections).flatten #=>
[
    'history',
    'spain',
    'history',
    'shipwrecks'
]

因此,您可以看到每个帖子的每个帖子post.collections都会返回所有帖子所在的集合(应该如此)。并且flatten方法并不关心是否存在重复 - 它只关心返回单个一维数组。因此,除非您在最终产品上调用uniq,否则这些重复项在整个操作过程中都会存在。

我相信有一种ActiveRecord方法可以避免这种情况:如果用户has_many :collections,那么@user.collections不应该有任何重复。可能是一个丑陋的AR宏,具有如此多的继承水平。

无论如何,希望有所帮助!