-1

我和一位同事正在我们的 Rails 应用程序中实现一个存储库模式,该模式从 ActiveRecord 中抽象出来。我们今天注意到,我们还不支持 find 获取数组。在尝试执行此操作时,我们想出了许多不同的可能方式来编写它。

此要点概述了四种可能性:https ://gist.github.com/jsseakle/6875446

我的同事最初赞成#1。我更喜欢 #2,因为它更类似于 AR 的工作方式,因此不太可能对开始使用此代码的新开发人员造成混淆。但是后来他提出了参数名称现在说谎的问题,所以我们在3中产生了这个想法。但是当然,当时使用的名称是说谎的,所以我们提出了4,它解决了所有的理论问题,但它非常长,看起来有点傻。

我想知道你们都认为哪个是最好的,以及你们看到的每个优点和缺点。

4

4 回答 4

1

ActiveRecord::Base#find接受尽可能多的 id,无论是作为单独的参数还是作为数组。我想说最干净的方法就是将nid 作为n单独的参数发送。IE:

[1] pry(main)> ids = 1
=> 1
[2] pry(main)> Project.find(*ids)
  Project Load (0.4ms)  SELECT "projects".* FROM "projects" WHERE "projects"."id" = $1 LIMIT 1  [["id", 1]]
=> #<Project:0x3fedc17ad980>
[3] pry(main)> ids = [1,2,3]
=> [1, 2, 3]
[4] pry(main)> Project.find(*ids)
  Project Load (0.8ms)  SELECT "projects".* FROM "projects" WHERE "projects"."id" IN (1, 2, 3)
=> #<Array:0x3fedc251ba54>
[5] pry(main)> Project.find(ids)
  Project Load (0.7ms)  SELECT "projects".* FROM "projects" WHERE "projects"."id" IN (1, 2, 3)
=> #<Array:0x3fedc2fc8164>

因为*foo对单个对象或对象集合都是安全的,所以我建议它是最干净的。

于 2013-10-07T22:06:26.157 回答
1

我同意克里斯。

def find(*ids)
  @source.find(*ids)
end

如果@source是一个实例ActiveRecord::Base并且可以被称为

find(1)
find(1,2,3)
find([1,2,3])

所以它也很灵活

于 2013-10-07T22:31:31.113 回答
0

我赞成方案一。我不喜欢检查特定类型,但检查它是否能够像数组一样/响应 find_all。

于 2013-10-07T22:03:26.447 回答
0

我认为#1 是最清楚的,在这一点上我会说这是最重要的。它并不总是我的鉴别器,但该示例具有最少的行,和/或最短的行,具有最简单的表达式。它就像人们所期望的那样。我的意见,当然。

于 2013-10-07T21:58:19.977 回答