Ruby on rails Ruby检查方法链接是否有价值
假设我有一个Ruby on rails Ruby检查方法链接是否有价值,ruby-on-rails,ruby,chain,Ruby On Rails,Ruby,Chain,假设我有一个活动记录类 如果我有: 房子里有很多人,有很多狗,有很多项圈 我不会做模式定义,因为它们很琐碎 现在我想从一个页面,在那里我有一个house对象,可以遍历该房屋中的所有项圈 因此: 如果房子里没有人,那么当链到达people.dogs时,我会得到一个未定义的方法错误 我可以用两种方法来解决这个问题。我可以将整个过程封装在一组if语句中,一次检查一个级别,并且只有在我首先验证了链的所有部分后才能执行上面的代码。我还可以使用begin和rescue 我的问题是: 还有别的办法吗?一些方法
活动记录
类
如果我有:
房子里有很多人,有很多狗,有很多项圈
我不会做模式定义,因为它们很琐碎
现在我想从一个页面,在那里我有一个house对象,可以遍历该房屋中的所有项圈
因此:
如果房子里没有人,那么当链到达people.dogs
时,我会得到一个未定义的方法
错误
我可以用两种方法来解决这个问题。我可以将整个过程封装在一组if语句中,一次检查一个级别,并且只有在我首先验证了链的所有部分后才能执行上面的代码。我还可以使用begin
和rescue
我的问题是:
还有别的办法吗?一些方法可以让我做一些类似的事情:
for c in foo(house.people.dogs.collars) do
puts c
end
没有其他代码。Foo将检查链是否有效,然后执行它,否则它将静默地什么也不做。如果没有最好的方法,我就自己做一个函数,让它返回一个散列或数组作为保证。你的假设是不正确的。因为
house.people
会返回一个数组。你不能在那个数组上调用狗。您必须对阵列中的每个人呼叫狗
如果关联中存在或不存在元素,则以下两种情况都适用:
house.people.flat_map(&:dogs).flat_map(&:collars)
您可能希望用house
上封装该逻辑的方法来清理这个问题
此外,值得一提的是,您将体验到糟糕的性能,因为链中的每一步都会导致对数据库的多次调用。根据数据库的大小,我会考虑用数据库连接来编写专门的范围。在Rails中:<代码> Hoo.人。试试((狗))。试试((项圈))< /代码>?谢谢,我的意思是,据我所见,已经写到当我尝试访问狗时会出现问题。我知道人们会返回一个数组,而数组没有“dogs”方法。我会看看这一点和答覆。是的:通过关系也会起作用,我已经用它们做了很多事情。我的问题很简单,因为在ruby中经常有一种非常简洁的方式来做各种事情,我想知道这里是否存在这样的事情。
house.people.flat_map(&:dogs).flat_map(&:collars)