我最近继承了一个项目,以前的开发人员在那里使用了Squeel。
在过去的一天里,我一直在学习“吱吱”,并且从网上可以找到一些关于如何使用它的知识。它的基本用途很简单。
我在网上找不到的(除了ruby-doc.org上没有给我多少帮助)是如何使用Squeel::Nodes::Join和Squeel::Nodes::Predicate。我唯一能发现的是,它们是表示联接关联/谓词表达式的节点,我对此也有同样的看法。我仍然不知道如何使用它们。
有人能帮助我或指点我一个好的教程/指南吗?
发布于 2015-01-07 16:01:40
我最好回答这个问题,因为我可以通过尝试和错误以及使用鲁比多作为指南来找出相当多的答案。我在这里说的每一件事都不是对每一件事的最终定义。这正是我所知道的,可能会在未来帮助某人,以防其他人被困在使用吱吱声进行动态查询的情况下。
节点::存根
让我们从Squeel::Nodes::Stub开始。这是一个Squeel对象,可以接受符号或字符串,并可以将其转换为表或列的名称。因此,您可以创建一个新的Squeel::Nodes::Stube.new("value")或Squeel::Nodes::Stube.new(:value),并在其他Squeel节点中使用这个存根。您将看到下面使用它的示例。
:节点::联接
节点::联接就像你可能怀疑的那样。它本质上是一个变量,您可以将其传递给Squeel {},然后执行所需的联接。您给它一个存根(有一个表名),还可以给它另一个变量来更改连接的类型(我现在只知道如何将它更改为外部连接)。你创造了一个这样的:
Squeel::Nodes::Join.new(Squeel::Nodes::Stub.new(:custom_fields), Arel::OuterJoin)
存根用来让连接知道我们想要加入custom_fields表,Arel::OuterJoin只是让连接知道我们想要做一个外部连接。同样,您不必在Squeel::Nodes::Join.new()中添加第二个参数,我认为它将默认执行内部连接。然后,您可以将其加入到模型中:
Person.joins{Squeel::Nodes::Join.new(Squeel::Nodes::Stub.new(:custom_fields), Arel::OuterJoin)}
Squeel::节点::谓词
节点::谓词在这一点上可能看起来很明显。只是比较而已。您给它一个存根(具有列名)、比较方法(您可以在[医]吱吱‘s千斤顶上的谓词部分找到它们)和一个与之比较的值,如下所示:
Squeel::Nodes::Predicate.new(Squeel::Nodes::Stub(:value), :eq, 5)
你甚至可以很容易地把他们中的两个人放在一起。
和:Squeel::Nodes::Predicate.new(Squeel::Nodes::Stub(:value1), :eq, 5) & Squeel::Nodes::Predicate.new(Squeel::Nodes::Stub(:value2), :eq, 10)
或:Squeel::Nodes::Predicate.new(Squeel::Nodes::Stub(:value1), :eq, 5) | Squeel::Nodes::Predicate.new(Squeel::Nodes::Stub(:value2), :eq, 10)
它们将返回带有嵌套Squeel::Squeel::Nodes::Or::谓词的Squeel::Nodes::Or或will。
然后,您可以像这样把它们放在一起(当然,变量a和谓词在变量b中可能有连接,因为您是动态地这样做的,否则您可能使用常规Squeel而不是Squeel节点):
Person.joins{Squeel::Nodes::Join.new(Squeel::Nodes::Stub.new(:custom_fields), Arel::OuterJoin)}.where{Squeel::Nodes::Predicate.new(Squeel::Nodes::Stub(:value1), :eq, 5) | Squeel::Nodes::Predicate.new(Squeel::Nodes::Stub(:value2), :eq, 10)}
不幸的是,我无法理解如何执行子查询:(
https://stackoverflow.com/questions/27707453
复制相似问题