【发布时间】:2017-03-10 21:13:38
【问题描述】:
在我的项目中,大量的 PORO 是由外部 API 等各种数据源组成的。对象看起来像:
{id: 1, name: 'Peter', age: 8}, {id: 2, name: 'Jack', age: 4}, {id: 3, name: 'Tom', age: 12}
我想要一个类似 ActiveRecord 的接口来查询这些对象。如Person.where(name: 'Jack')和Person.where("age > ?", 5)
我的尝试如下所示:
class Query
def initialize(objs)
@objs = objs
end
def where(name: nil, age: nil)
result = @objs
result = result.select{|x| x.name == name} if name
result = result.select{|x| x.age == age} if age
result
end
end
它有效,但我认为这不是一个好的解决方案:
- 如果有 20 个属性怎么办?
where方法可能会变得很长且容易出错。 - 其他有用的 ActiveRecord 查询呢?例如
find、find_by、pluck、order by等等。即使我可以全部实现它们,我如何“链接”多个查询? - 效率:如何像 sql 查询规划器一样优化查询?
- 最重要的是,如何实现
Person.where("age > ?", 5)和其他灵活查询?
我错过了什么吗?我觉得我在重新发明轮子。
我检查过 ActiveModel,但不幸的是它没有查询系统。
有什么可以提供帮助的宝石吗?
【问题讨论】:
-
复制
where的功能可能是一项合理的工作,但是为内存中的对象重新创建整个 ActiveRecord 查询接口将是一项艰巨的任务。这不是 StackOverflow 问题的好主题。 -
你是对的。我不想实现 ActiveRecord 接口;我正在寻找可以为我完成繁重工作的宝石或工具。
标签: sql ruby-on-rails ruby activerecord activemodel