Ruby on rails 在rails 3.1.4中使用sqlite3实现联合的正确方法?
在我们的rails应用程序中,有3个表Ruby on rails 在rails 3.1.4中使用sqlite3实现联合的正确方法?,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,在我们的rails应用程序中,有3个表支付日志,搜索和购买。付款日志属于采购或采购,但不能同时属于两者。采购和采购都有一个col项目id。我们希望获取所有付款日志,其项目id=project\u id\u search(从搜索页面传递的项目id\u search)。我们还需要一个ActiveRecord作为返回的结果集。下面是一个单独的查询,假设付款日志包含ActiveRecord结果集: 选择所有付款日志及其采购的项目\u id=项目\u id\u搜索 payment\u logs=payme
支付日志
,搜索
和购买
。付款日志属于采购或采购,但不能同时属于两者。采购和采购都有一个col项目id
。我们希望获取所有付款日志,其项目id=project\u id\u search(从搜索页面传递的项目id\u search)。我们还需要一个ActiveRecord作为返回的结果集。下面是一个单独的查询,假设付款日志包含ActiveRecord结果集:
payment_logs.where(["
payment_logs.sourcing_id IN (
SELECT id FROM sourcings WHERE sourcings.project_id = ?
)
OR payment_logs.purchasing_id IN
(
SELECT id FROM purchasings WHERE purchasings.project_id = ?
)", project_id_search, project_id_search])
很多SQL,但它应该可以工作
选项2(两个SQL请求…):
我喜欢这个解决方案:)
此外,无论何时,只要您在控制台或其他任何地方对生成的SQL有疑问,您都可以在ActiveRecord查询的末尾添加.to_SQL,以再次检查生成的SQL是否有效。谢谢有没有办法用rails风格的查询替换SELECT?类似于Sourcing.where(“project\u id=?”,project\u id\u search)。选择(“id”)。我在更换时犯了很多错误。我试图找到更好的方法,但找不到太多。。。我认为您必须坚持这种难看的SQL语法,或者如果您愿意执行多个SQL请求,您可以分别执行两个请求,然后合并我试图合并但没有成功的两个结果集。我的想法和你发的一样。试图以rails方式实现。使用的范围是:sourcing\u id=>[sourcing\u id]或:purchasing\u id=>[purchasing\u id],但没有成功。在何处试用(“采购id在?或采购id在?,[采购id],[采购id])。两者都不起作用。在我的答案中添加了选项2,你可以试试:)在何处使用[]的目的是什么?
payment_logs = []
payment_logs << PaymentLog.joins(:sourcing).where("sourcings.project_id" => project_id_search)
payment_logs << PaymentLog.joins(:purchasing).where("purchasings.project_id" => project_id_search)
payment_logs.uniq! #In case some records have both a sourcing and a purchasing
PaymentLog.where{(source_id.in Sourcing.where(:project_id => project_id_search)) | (purchasing_id.in Purchasing.where(:project_id => project_id_search))}