2014-09-04 44 views
0

我有一个循环,它碰到了一对范围,然后将结果推送到一个数组中。我遇到的问题是如果没有记录匹配范围,它仍然会返回一个ActiveRecord :: AssociationRelation []。我如何过滤这些,所以我没有让他们在我的阵列?只有当范围返回记录时才将对象推入数组,而不是空白

实施例:

class Snack 
    belongs_to :member 

    scope :red, -> { where(color: 'red') } 
    scope :snacktypefind, -> (snacktypefind) { where(snacktype: snacktypefind) } 
end 

class Member 
    has_many :snacks 

def find_snacks(snacktypes) 
    returnarray = [] 
    snacktypes.each do |snacktype| 
     returnarray << self.snacks.red.snacktypefind(snacktype) 
    end 
    return returnarray 
end 

end 

然后,在图说我希望:

<% @member.find_snacks(['bannana','orange']).each do |snack| %> 
    <li>snack.name</li> 
<% end %> 

在上述情况下,我想在阵列为[]但相反,它是:

[#<ActiveRecord::AssociationRelation []>, #<ActiveRecord::AssociationRelation []>] 

这次我做错了什么傻事?再次感谢您的帮助!

+0

如果'.length> 0',为什么不推送它们? – 2014-09-04 19:05:38

+0

我尝试过,并且由于没有长度函数而导致记录返回时出错。但我可能做错了。 – MechDog 2014-09-04 19:07:54

+1

你可以尝试'count'。你是否试图将'concat'值实际应用到数组上,或者维护一个具有值的作用域数组,或者......? – 2014-09-04 19:10:24

回答

1

哇你使它方式与额外的代码更容易这个怎么样

class Member 
    has_many :snacks 

    def find_snacks(snacktypes) 
    snacks.red.snacktypefind(snacktypes) 
    end 

end 

这变成

"SELECT snacks.* FROM snacks WHERE snacks.member_id = YOUR_MEMBER_ID AND snacks.color = 'red' AND snacks.snacktype IN (YOUR snacktypes array)" 

目前您的实现,我们将其称为“查询,并推”有缺点。

首先,这将创建多个微型集合,可能由单个对象组成。这将是迭代的地狱,因为你将不得不迭代实际访问对象。 其次,这将为每个snacktype创建多个查询1,这会降低性能。

你真正想要的是链式查询方法将范围缩小到只包含你需要的元素的单个ActiveRecord::Relation。这将执行一个单一的查询,当你迭代管道对象将是你想访问的实际对象,而不是另一个ActiveRecord::Relation,这将不得不重复。

ActiveRecord Query Methods关于作用域和查询链的重要部分是它们在链完成之前不会被执行,允许您以非常精细的方式轻松添加和删除条件。通过这种方式,您可以明确地将数据定位到数据库中,而不是将其加载到内存中并从那里清除它。

+0

10快餐类型如何得到可变小吃类型?轨道是否采用复数形式并迭代它们?总是令人惊叹的一些事情!没关系,我错过了更正。对于那个很抱歉。现在尝试使用*(splat)运算符 – MechDog 2014-09-04 19:49:16

+0

,它将使用这个'('banana','orange')''的参数,并在传递给它时使它们成为数组'''banana','orange']'查询方法'where'作为'Hash'。例如'在哪里(snacktype:['banana','orange'])'它看到这是一个'Array'并创建了一个'IN'语句而不是'='语句。 – engineersmnky 2014-09-04 19:52:04

+0

我更正了代码,它应该是一个数组进入。感谢您的信息!我已经尝试过了,并且我似乎还是会回到#,有时我会将某些链接在一起。我会仔细检查。耻辱他们没有办法摆脱#而不是所有这些箍跳。 – MechDog 2014-09-04 20:01:12

0

我落得这样做:

def find_snacks(snacktypes) 
    returnarray = self.snacks.none 

    snacktypes.each do |snacktype| 
    returnarray += self.snacks.red.snacktypefind(snacktype) 
end 
return returnarray 
end 

仅适用于因.none轨道4,但我没有轨道3个项目,所以我想这是好的。

相关问题