NSPredicate可以检测存在于多个实体关系中的整个实体集

时间:2018-08-03 20:35:18

标签: core-data nspredicate

给出这样的核心数据实体设置

  • 实体 A
    • aB-> B (多至1)
    • aC-> C (多于1)
    • 孩子-> 孩子(很多)
  • 实体 B
    • 孩子-> 孩子(很多)
  • 实体 C
    • 孩子-> 孩子(很多)
  • 实体孩子

我正在尝试查询所有实体 A ,以便在所有可访问的子实体中找到一组子实体 TestChildren 。类似于此示例的匹配 A 实体 A1

  • TestChildren 设置

    • Child1
    • Child2
    • Child3
    • Child4
  • A1 实体

    • aB-> B1
    • aC-> C1
    • 儿童
      • -> child1
      • -> child3
  • B1 实体
    • 儿童
      • -> child2
  • C1 实体
    • 儿童
      • -> child4

因此,在每个班级的各种孩子关系中都找到了所有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中表达这一点?

更糟糕的是,我可以做一个更简单的查询,并对返回的结果执行更多的逻辑,但是理想情况下,我会尝试在查询中进行尽可能多的繁重工作。

预先感谢

2 个答案:

答案 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以及child2child3的所有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)