0

我目前正在开发一个 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

先感谢您!

菲利普

4

2 回答 2

1

Rails 代码相当于你的 sql 是,

Tagging.find_all_by_post_id(@posts.map{|p| p.id})

与哪里

Tagging.where(:post_id => @posts.map(&:id))
于 2013-08-27T18:37:23.297 回答
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
于 2013-08-27T19:01:59.070 回答