查找具有特定帖子的所有男性用户

时间:2014-06-03 08:20:24

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

假设我有一个Moder User有许多Posts

所以现在例如我选择男性的Users

User.where(gender: male)

如何扩展搜索查询并仅选择标记为Post [sport,holiday]的男性用户?

如果我只需要使用Posts,我只需致电:

Post.where(tag: [sport,holiday])

如何连接这两个查询?

4 个答案:

答案 0 :(得分:5)

join应该有效:

User.joins(:posts).where(gender: male, posts: { tag: [sport, holiday] })

uniq会使您的查询DISTICT

User.joins(:posts).where(gender: male, posts: { tag: [sport, holiday] }).uniq

或者:

User.includes(:posts).where(gender: male, posts: { tag: [sport, holiday] })

答案 1 :(得分:1)

考虑到您已正确设置关联(user has_many posts),您可能需要使用scopesassociations的组合来执行此操作它:

#app/models/user.rb
Class User < ActiveRecord::Base
   has_many :posts do
      def tagged tags
         where tag: tags
      end
   end

   scope :male, -> { where(gender: male) }
end

#app/models/post.rb
Class Post < ActiveRecord::Base
   belongs_to :user
end

这将允许您致电:

users = User.male # -> returns collection
users.each do |user|
    user.posts.tagged([sport, holiday]) #-> returns collection of posts with tags
end

<强>更新

另一方面,您可以使用以下方法:

#app/models/post.rb
Class Post < ActiveRecord::Base
   belongs_to :user
   scope :tagged, ->(tags)   { where(tag: tags) }
   scope :gender, ->(gender) { joins(:user).where(gender: gender) }
end

#app/models/user.rb
Class User < ActiveRecord::Base
   has_many :posts
end

**在测试joins范围的过程中 - 不确定这是否有效

-

这将允许您致电(感谢scope chaining):

tagged_posts = Post.tagged([sport,holiday]).gender(male)

答案 2 :(得分:0)

我会说

@users = Post.where(tag: [sport,holiday]).users.where(gender: male)

答案 3 :(得分:0)

正确的是打电话:

User.joins(:posts).where(gender: male, posts: { tag: [sport, holiday] }).uniq

这样用户只能选择一次