给出这样的核心数据实体设置
我正在尝试查询所有实体 A ,以便在所有可访问的子实体中找到一组子实体 TestChildren 。类似于此示例的匹配 A 实体 A1
TestChildren 设置
A1 实体
因此,在每个班级的各种孩子关系中都找到了所有4个孩子。
似乎要测试这些集合,我必须对每个Children关系执行子查询,但是我认为我无法用NSPredicate格式表达我想要的内容。也许它根本无法在NSPredicates中使用吗?< / p>
我的主意是要做这样的事情
predicateString += "((SUBQUERY(aB.children, $child, $child in %@).@count + SUBQUERY(aC.children, $child, $child in %@).@count + SUBQUERY(children, $child, $child in $@).@count) == $@)"
predicateVars.append(contentsOf: [testChildren, testChildren, testChildren, testChildren.count])
如果所有子关系中的匹配总数必须匹配..不幸的是,如果同一个孩子可以出现在多个A,B或C中,那么这将是不正确的,因为在两个不同的类将使总数不能正确匹配。
无论如何看来,在NSPredicates中甚至不可能实现累加计数?
真正正确执行此操作的唯一方法是能够生成3个类中所有子级的总数,但是似乎还没有一种方法可以在NSPredicate中表达这一点?
更糟糕的是,我可以做一个更简单的查询,并对返回的结果执行更多的逻辑,但是理想情况下,我会尝试在查询中进行尽可能多的繁重工作。
预先感谢
答案 0 :(得分:1)
断言找到带有孩子的所有A:
RSpec.describe "Sessions", type: :request do
it "redirects to the internal home page" do
user = FactoryBot.create(:user, password: 'password 123', password_confirmation: 'password 123')
post user_session_path, params: {user: {email: user.email, password: 'password 123'}}
expect(response).to redirect_to(internal_home_index_path)
end
end
AND谓词查找NSPredicate(format:"aB.children contains %@ OR aC.children contains %@ OR children contains %@", child, child, child)
和child1
以及child2
和child3
的所有A:
child4
答案 1 :(得分:0)
上述Willeke答案的另一种形式是用包含变量的字符串构建谓词,如下所示
var predicateString:String = ""
var predicateVars:[Any] = []
for child in testChildren
{
if (predicateString.count > 0)
{
predicateString += " && "
}
predicateString += "(aB.children contains %@ || aC.children contains %@ || children contains %@)"
predicateVars.append(contentsOf: [child, child, child])
}
let predicate = NSPredicate(format: predicateString, argumentArray: predicateVars)