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 的条件 而被过滤掉
joins直接能接受一个symbol,如果A has_many B 那么
joins
symbol
A
has_many
B
A.joins(:B)
就行了,然后has_many可以加上一个lambda
lambda
class A has_many :B, -> {...} end
这样 join 的时候会自动把条件加上
谢谢回答,若有的地方也利用了 A join B, 但不想过滤,这个会不通用吗
需要的时候再写别的has_many或has_one
has_one
干嘛在 on 上加 where 条件... 直接 join 完了 where 就是
直接 where 的话,比如,用 A join B, 后面的 where 是对 B 进行过滤,所以 A 的记录也会变少,而我只想过滤 B,保留 A 的数据,用 left join
ON 和 WHERE 只有在 INNER JOIN 的时候是等价的...
https://stackoverflow.com/questions/354070/sql-join-where-clause-vs-on-clause
sanitize_sql
😐没看到 left join
那就A.joins(ActiveRecord::Base.send(:sanitize_sql, ["LEFT JOIN bs ON as.id = bs.id AND bs.state in (?)", state_arr]))
A.joins(ActiveRecord::Base.send(:sanitize_sql, ["LEFT JOIN bs ON as.id = bs.id AND bs.state in (?)", state_arr]))
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
然后就解决啦,谢谢