首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ruby on rails中使用模型关联进行查询

在ruby on rails中使用模型关联进行查询
EN

Stack Overflow用户
提问于 2011-05-13 14:42:56
回答 2查看 493关注 0票数 1

模型A has_many模型B。我想返回与某些类型的模型B的所有模型。

例如,我希望返回同时拥有福特类型的车辆和雪佛兰类型的车辆的所有用户(福特和雪佛兰是车辆模型的属性)

我可以很容易地查询到所有拥有福特或雪佛兰的用户,但我不想做两个查询,然后将结果相交。相反,我只想执行一次查询。如何将其合并到一个查询中?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-13 16:20:26

解决方案1

代码语言:javascript
复制
User.joins([:vehicles, :vehicles]).
     where("vehicles.model = ? AND vehicles_users.model = ?", "Ford", "Chevy")

解决方案2

支持任意模型。

代码语言:javascript
复制
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

较慢的解决方案,以防你需要一个..

代码语言:javascript
复制
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"
])
票数 1
EN

Stack Overflow用户

发布于 2011-05-13 15:11:01

编辑:要让用户同时使用福特和雪佛兰,你可以这样做:

代码语言:javascript
复制
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个查询:

代码语言:javascript
复制
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

旧答案(检索具有这两种类型之一的用户):

代码语言:javascript
复制
User.joins(:vehicle).where(:vehicles => {:type => ["Ford", "Chevrolet"]})

或者(我不确定"properties“在你的问题中是什么意思):

代码语言:javascript
复制
User.joins(:vehicle).where("vehicles.ford = 1 OR vehicles.chevrolet = 1")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5988186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档