在这个(简化的)系统中,
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,在哪里,拥有和计数的数量使我感到难以置信!
任何人都知道我要在这里做什么,如果有的话我可能会怎么做?
答案 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 方法(用于显示控制台的返回值)加载收藏集。