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

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

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 的条件 而被过滤掉

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

然后就解决啦,谢谢

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