我和同事正在我们的Rails应用程序中实现一个存储库模式,该应用程序从ActiveRecord中抽象出来。我们今天注意到我们还没有支持查找阵列。在尝试这样做时,我们提出了许多不同的方法来编写它。
这个要点概述了四种可能性:https://gist.github.com/jseakle/6875446
我的同事原本赞成#1。我更喜欢#2,因为它更像AR的工作方式,因此不太可能对开始使用此代码的新开发人员造成混淆。但后来他提出了争论名称现在所在的问题,所以我们在3中产生了这个想法。当然,这个名字在使用时就是撒谎,所以我们提出了4,它解决了所有的理论问题,但是很长,看起来有点傻。
我想知道你们认为哪一个是最好的,以及你们每个人看到的优点和缺点。
答案 0 :(得分:1)
ActiveRecord::Base#find
接受尽可能多的ID,无论是作为单独的参数还是作为数组。我说最干净的方法是将n
ID作为n
单独的参数发送。即:
[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
对单个对象或对象集合是安全的,所以我建议它是最干净的。
答案 1 :(得分:1)
我同意克里斯。
def find(*ids)
@source.find(*ids)
end
如果@source
是ActiveRecord::Base
的实例并且可以像那样调用,则将起作用
find(1)
find(1,2,3)
find([1,2,3])
所以它也非常灵活
答案 2 :(得分:0)
我认为#1是最清晰的,在这一点上我会说这是最重要的。它并不总是我的鉴别器,但是该示例具有最少的行和/或最短的行,具有最简单的表达式。它只是读起来像人们所期望的那样。我的意见,当然。
答案 3 :(得分:0)
我赞成选项一。我不喜欢检查特定类型,但检查它是否能像数组一样/响应find_all。