新手问题 Rails 如何在 joins 函数中传数组参数?

UOvOU-github · 2017年10月13日 · 最后由 UOvOU-github 回复于 2017年10月17日 · 1297 次阅读

where函数传递参数可以用

A.where("id = ?",  p_id)

但查阅文档发现joins, 没有这样的操作 请问如何能达到类似如下的效果

A.joins("LEFT JOIN bs ON as.id = bs.id AND bs.state in (?)", state_arr)

用on 的原因是,不想A因 B的条件 而被过滤掉

共收到 9 条回复
1楼 已删除

joins直接能接受一个symbol,如果A has_many B 那么

A.joins(:B)

就行了,然后has_many可以加上一个lambda

class A
    has_many :B, -> {...}
end

这样join的时候会自动把条件加上

ad583255925 回复

谢谢回答,若有的地方也利用了A join B, 但不想过滤,这个会不通用吗

UOvOU-github 回复

需要的时候再写别的has_manyhas_one

干嘛在on上加where条件... 直接join完了where就是

mizuhashi 回复

直接where的话,比如,用A join B, 后面的where是对B进行过滤,所以A的记录也会变少,而我只想过滤B,保留A的数据,用left join

hooopo 回复

😐没看到left join

那就A.joins(ActiveRecord::Base.send(:sanitize_sql, ["LEFT JOIN bs ON as.id = bs.id AND bs.state in (?)", state_arr]))

10楼 已删除
mizuhashi 回复
A.joins(A.send(:sanitize_sql_for_conditions, ["LEFT JOIN bs ON as.id = bs.id AND bs.state in (?)", state_arr])

:sanitize_sql 新版本改名成了 sanitize_sql_for_conditions 然后他的调用者得是一个ActiveRecord的任意的继承者 不然会报错

undefined method 'abstract_class?' for Object:Class

然后就解决啦,谢谢

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