Rails ActiveRecord 多条件查询,但指向的是同一个表的问题

hexawing · 2013年06月05日 · 最后由 doabit 回复于 2013年06月06日 · 4901 次阅读

大致是这样: 报价 (Quote),有商务 (business) 负责做它,但由销售 (sale) 发给客户,所以模型如下:

class Quote < ActiveRecord::Base
    belongs_to :sale, :class_name => 'User', :foreign_key => 'sale_user_id'
    belongs_to :business, :class_name => 'User', :foreign_key => 'business_user_id'
end
class User < ActiveRecord::Base
    has_many :quotes, :foreign_key => 'sale_user_id'
    has_many :deal_quotes, :class_name => 'Quote', :foreign_key => 'business_user_id'
end

单独查询都没问题:

>> Quote.where("users.id = 14").includes("sale").size #销售14名下的报价
94
>> Quote.where("users.id = 11").includes("business").size #由商务11做的报价
105

现在我想把它们AND起来,但就不对了啊,两个都是users.id,结果就是 0…… 有没有什么 alias 之类的东东来解决这个问题啊?

Quote.where("sale_user_id in (?) or business_user_id in (?)", [11, 14], [11, 14]).

#1 楼 @doabit 呃,这个确实可以用,但也是因为这里正好没用到跨表的字段……如果我查的不是 id,而是 name 什么的怎么办……

>> Quote.where("users.name = ?", "张三").includes("sale").size #销售14名下的报价
94
>> Quote.where("users.name = ?", "李四").includes("business").size #由商务11做的报价
105

这样子……

#2 楼 @hexawing 你这个设计我不太明白,你为什么不直接用user_id 而用 business_user_idsale_user_id

#3 楼 @doabit 因为二者是不一样的含义,只用一个 user_id 的话不够用啊。 一个案子由销售跟客户谈,但销售只知道商品的参数信息,价格条款这些还得商务来确定,所以一个报价必然会经两个人的手

#4 楼 @hexawing 哦,明白了,你的意思是查找有两人同时报价的么,你试下这个吧

Quote.joins("LEFT OUTER JOIN users ON users.id = quotes.sale_user_id or users.id=quotes.business_user_id").where("users.name in (?)", ['张三', '李四'])

#5 楼 @doabit 好的,我等下试试,谢谢。 这个 joins 后面加 SQL 是个什么用法啊?我之前一直以为 joins 和 includes 一样,后面只能跟 has_many 或者 belongs_to 的那些东东呢……

需要 登录 后方可回复, 如果你还没有账号请 注册新账号