我目前正在开发Ruby on Rails应用程序并遇到了一个我无法解决的问题。 我将从头开始构建一个标签系统,就像Ryan Bates建立的那样(见这里:http://railscasts.com/episodes/382-tagging?view=asciicast)
所以我对这个问题感到疯狂:
假设我有以下型号:
class Post < ActiveRecord::Base
has_many :taggings, dependent: :destroy
has_many :tags, through: :taggings
end
class Tagging < ActiveRecord::Base
belongs_to :tag
belongs_to :post
end
class Tag < ActiveRecord::Base
has_many :taggings
has_many :things, through: :taggings
end
我现在有一个索引页面,其中显示所有帖子。我还想显示与页面上显示的所有帖子相关联的所有标签。
到目前为止,我所做的是我可以在加载帖子时包含所有标签:
# posts_controller/index.rb
def index
@posts = current_user.posts.includes(:tags)
end
但是当我遍历标签时,我会得到重复的内容。
- @posts.each do |post|
= raw post.tags.map(&:name).map { |t| link_to t, tag_path(t) }.join(', ')
有没有人有这个解决方案?如何加载与帖子集合相关联的所有标签。
在这里,我已经在SQL中描述了我的问题的解决方案,也许有人可以帮助我。
SELECT DISTINCT name FROM tags INNER JOIN taggings ON taggings.tag_id = tags.id
WHERE taggings.post_id IN (1, 2, 3, ...) // The Post IDS
提前谢谢!
菲利普
答案 0 :(得分:1)
Rails代码等同于你的sql,
Tagging.find_all_by_post_id(@posts.map{|p| p.id})
with where
Tagging.where(:post_id => @posts.map(&:id))
答案 1 :(得分:1)
您可以在控制器中设置另一个实例变量,通过调用uniq
来收集所有唯一标记,例如:
def index
@posts = current_user.posts.includes(:tags)
@tags = @posts.map(&:tags).flatten.uniq
end
顺便说一句,如果你想生成你在Ruby中指定的SQL,你可以这样做:
Tag.joins(:taggings).where(:taggings => { :post_id => @posts }).uniq