Rails ActiveRecordRelation获取所有引用的条目

时间:2013-08-27 18:28:27

标签: ruby-on-rails ruby activerecord rails-activerecord

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

提前谢谢!

菲利普

2 个答案:

答案 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