[英]Querying with model associations in ruby on rails
模型A has_many模型B。我想返回某些模型B的所有模型As。
例如,我要返回所有拥有福特类型的车辆和雪佛兰类型的车辆的用户(福特和雪佛兰是Vehicle模型的属性)
我可以轻松查询以找到所有拥有福特汽车的用户或所有拥有雪佛兰汽车的用户,但是我不想进行2次查询然后将结果相交。 相反,我只想执行1个查询。 如何将其合并为1个查询?
解决方案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)
)
解决方案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"
])
编辑:要获得同时使用福特和雪佛兰汽车的用户,可以执行以下操作:
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"]})
或者(我不确定您的问题中的“属性”是什么意思):
User.joins(:vehicle).where("vehicles.ford = 1 OR vehicles.chevrolet = 1")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.