Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Ruby检查方法链接是否有价值_Ruby On Rails_Ruby_Chain - Fatal编程技术网

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)