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

UOvOU-github · October 13, 2017 · Last by UOvOU-github replied at October 17, 2017 · 1758 hits

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 Floor has deleted

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

A.joins(:B)

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

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

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

Reply to ad583255925

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

需要的时候再写别的has_manyhas_one

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

Reply to mizuhashi

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

Reply to 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 Floor has deleted
Reply to 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

然后就解决啦,谢谢

You need to Sign in before reply, if you don't have an account, please Sign up first.