您好我有一个帖子模型和一个收藏模型,通过收藏模型连接在一起。当用户发帖时,他将帖子添加到集合中,例如“音乐”。但是,当我列出所有用户的集合时,每个帖子都有多个“音乐”条目而不是1个。 我正在使用@collections = @ user.posts.map(&:collections).flatten抓取集合,如果我在末尾添加.uniq则不会重复(@collections = @ user.posts.map(&) :集合).flatten.uniq)但有人可以解释为什么我必须这样做???非常感谢。
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
<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
has_many :posts, :dependent => :destroy
has_many :collections, :through => :posts
答案 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宏,具有如此多的继承水平。
无论如何,希望有所帮助!