假设我有一个Moder User
有许多Posts
。
所以现在例如我选择男性的Users
:
User.where(gender: male)
如何扩展搜索查询并仅选择标记为Post
[sport,holiday]
的男性用户?
如果我只需要使用Posts
,我只需致电:
Post.where(tag: [sport,holiday])
如何连接这两个查询?
答案 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
),您可能需要使用scopes
和associations
的组合来执行此操作它:
#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
这样用户只能选择一次