Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在rails 3.1.4中使用sqlite3实现联合的正确方法?_Ruby On Rails_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 在rails 3.1.4中使用sqlite3实现联合的正确方法?

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

在我们的rails应用程序中,有3个表
支付日志
搜索
购买
。付款日志属于采购或采购,但不能同时属于两者。采购和采购都有一个col
项目id
。我们希望获取所有付款日志,其项目id=project\u id\u search(从搜索页面传递的项目id\u search)。我们还需要一个ActiveRecord作为返回的结果集。下面是一个单独的查询,假设付款日志包含ActiveRecord结果集:

  • 选择所有付款日志及其采购的项目\u id=项目\u id\u搜索

    payment\u logs=payment\u logs.Join(:寻源)。其中(“sourcings.project\u id=?”,project\u id\u search)

  • 选择所有付款日志及其采购的项目\u id=项目\u id\u搜索

    付款日志=付款日志。(:采购)。其中(“purchasings.project\u id=?”,project\u id\u search)

  • 我们需要联合1和2以获取所有项目id=项目id搜索的付款日志。正确的方法是什么?我们没有在rails中找到union,find_by_sql返回的数组不是我们想要的。谢谢

    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))}