Rails has_many相关记录符合条件的地方

时间:2018-10-28 14:16:59

标签: sql ruby-on-rails postgresql activerecord

在这个(简化的)系统中,

var modal = document.getElementById("projectModal");
    var modalContent = document.getElementById("modalContent");
    function openModal() {
        modal.style.display ="block";
        noScroll();
    }
    // Close Modal
    function closeModal() {
        modal.style.display ="none";
        addScroll();
    }

    var projectIndex =1;
    showProjects(projectIndex);

    function nextProject(n) {
        showProjects(projectIndex+=n);
    }

    function currentProject(n) {
        showProjects(projectIndex=n);
    }

    function showProjects(n) {
        var i;
        var projects = document.getElementsByClassName("projects");
        if (n>projects.length) {
            projectIndex =1
        }
        if  (n<1) {
            projectIndex= projects.length
        }
        for (i=0;i<projects.length; i++) {
            projects[i].style.display = "none";

        }
      projects[projectIndex-1].style.display ="block";
        modalContent.scrollTop = 0;
    }
// Prevent bodyscrolling
function noScroll() {
    body.classList.add("noScroll");
}  

//Enables bodyscrolling        
function addScroll() {
    body.classList.remove("noScroll");  
}

import os import tempfile import pytest from my_app import app, db @pytest.fixture def client(): db_fd, app.config["DATABASE"] = tempfile.mkstemp() app.config["TESTING"] = True with app.app_context(): db.init_app(app) yield app os.close(db_fd) os.unlink(app.config["DATABASE"]) @pytest.fixture def client(request): client = app.test_client() return client class Order has_one :bill ... end class Bill has_many :rebills belongs_to :order ... end class Rebill belongs_to :bill ... end 都有一个Bill列,该列可能处于多种状态之一,有些等于成功,有些等于失败。

我目前正在尝试查找所有未成功付款的Rebill条记录。如果关联的status记录处于失败状态,并且该Order记录具有 no 关联的Bill记录位于成功状态。

如果Bill的{​​{1}}失败了,Rebill也失败了,第二Order成功了,则Bill已经付款,我对此不感兴趣。

如果Rebill的{​​{1}}失败并且没有关联的Rebill,则它没有成功付款,并且我 am 对此感兴趣。

如果Order的{​​{1}}失败,并且任意数量的Order处于失败状态(但没有一个处于成功状态),则没有成功付款,我 am 对它感兴趣。

因此,我的问题是如何构建一个查询,该查询返回没有某种成功付款的所有Bill记录?真正的问题是,我在多个地方都持有成功付款的想法,这很糟糕。但是,我觉得我应该能够耳语正确的SQL咒语来做到这一点,但是join,在哪里,拥有和计数的数量使我感到难以置信!

任何人都知道我要在这里做什么,如果有的话我可能会怎么做?

2 个答案:

答案 0 :(得分:0)

没有那么复杂。首先,让我们找到具有Order记录处于失败状态的所有Bill记录。

Order.joins(:bill).where(bills: { state: "failed" })

现在让我们确保对于Bill,没有Rebill处于成功状态:

Order.joins(:bill).where(bills: { state: "failed" })
     .where("NOT EXISTS(SELECT 1 FROM rebills 
                        WHERE bill_id = bills.id 
                        AND rebills.state = successful)")

您也许可以以更ActiveRecord的方式编写NOT EXISTS查询,我通常会放弃并使用原始SQL。

DB fiddle已附上。

答案 1 :(得分:0)

类似的事情应该可以完成。

# rebills contains all rebills with a successful payment
rebills = Rebill.where(status: 'successful')
# bills contains bills without a successful payment
# that are not associated with the above described rebills 
bills = Bill.where.not(status: 'successful', id: rebills.select(:bill_id))
# orders contains orders that are associated with the above described bills
orders = Order.where(id: bills.select(:order_id))

在加载orders时,以上代码应执行一个查询。

注意:在复制到控制台后,在行后加上;nil以防止 inspect 方法(用于显示控制台的返回值)加载收藏集。