模型A has_many模型B。我想返回与某些类型的模型B的所有模型。
例如,我希望返回同时拥有福特类型的车辆和雪佛兰类型的车辆的所有用户(福特和雪佛兰是车辆模型的属性)
我可以很容易地查询到所有拥有福特或雪佛兰的用户,但我不想做两个查询,然后将结果相交。相反,我只想执行一次查询。如何将其合并到一个查询中?
发布于 2011-05-13 16:20:26
解决方案1
User.joins([:vehicles, :vehicles]).
where("vehicles.model = ? AND vehicles_users.model = ?", "Ford", "Chevy")解决方案2
支持任意模型。
models = ["Ford", "Chevy"]
User.where(:id => User.joins(:select => "users.id", :vehicles).
where(:vehicles => {:model => models}).group("users.id").
having("COUNT(*) = #{models.size}").limit(30)
)Reference 1
解决方案3
较慢的解决方案,以防你需要一个..
User.where([
"EXISTS (
SELECT A.*
FROM vehicles A
WHERE A.user_id = users.id AND
A.model = ?) AND
EXISTS (
SELECT B.*
FROM vehicles B
WHERE B.user_id = users.id AND
B.model = ?)
", "Ford", "Chevy"
])发布于 2011-05-13 15:11:01
编辑:要让用户同时使用福特和雪佛兰,你可以这样做:
User.
select("DISTINCT users.*").
joins("INNER JOIN vehicles AS v1 ON v1.user_id = users.id").
joins("INNER JOIN vehicles AS v2 ON v2.user_id = users.id").
where("v1.type" => "Ford", "v2.type" => "Chevrolet").编辑2:,或者,如果你更喜欢干净的代码,并且可以容忍2个查询:
class User < ActiveRecord::Base
scope :with_vehicule, lambda { |type| joins(:vehicles).where(:type => type) }
# ...
end
users_with_both = User.with_vehicle("Ford").to_a & User.with_vehicle("Chevrolet").to_a旧答案(检索具有这两种类型之一的用户):
User.joins(:vehicle).where(:vehicles => {:type => ["Ford", "Chevrolet"]})或者(我不确定"properties“在你的问题中是什么意思):
User.joins(:vehicle).where("vehicles.ford = 1 OR vehicles.chevrolet = 1")https://stackoverflow.com/questions/5988186
复制相似问题