2009-10-05 26 views
2

如果我有T-SQL(或存储过程)从多个表返回记录(也许使用DBI),有没有办法让我手动实例化ActiveRecord模型及其关联?很显然,我在数据库性能之后。我希望能够构建自己的对象层次结构(模型及其关系),但是当我完成所有工作时,我希望每个模型都能正常运行。也就是说,我希望这可以在没有可能导致我的结构行为异常的黑客攻击下完成。手动实例化ActiveRecord模型及其关系?

编辑:

这是有点做作,但它确实说明了如何一个查询可以返回数据n级深(其中“n”只有实际限制),并在一个调用返回一切到数据库:

SELECT * FROM customers 
    WHERE id = 1; 

SELECT * FROM orders 
    WHERE customer_id = 1; 

SELECT * FROM lineitems 
    WHERE order_id IN (
    SELECT id FROM orders 
    WHERE customer_id = 1 
); 

然后拥有所有的记录,我会简单地映射我自己的关联。通过ActiveRecord和:include来做这件事的问题是,它会多次访问数据库而不是仅仅一次 - 随着“n”的增加,更多的是征税。

+0

我是否正确理解您想要获取SQL查询的结果并从它们实例化ActiveRecord对象? – 2009-10-05 15:28:56

+0

是的,还有协会。 – Mario 2009-10-06 00:06:09

+0

如果仔细观察,您最后的查询实际上不会返回订单和客户,它只是返回lineitems。如果你需要这3个查询来获得assosciations,那么它与使用include相同:include with ActiveRecord – Staelen 2009-10-06 02:02:32

回答

0

如果我明白你在做什么,你试图一次执行多个sql查询,并且仍然会像通常那样返回所有实例化的模型。

你真正想要的是:

Customer.find(:all, :include => {:orders => :lineitems}) 

这将获取所有记录您在单个查询兴趣和创造AR对象正确。

+0

我应该补充说,任何比这更复杂的东西(比如存储过程)可能会浪费你的时间。这听起来像你正试图过早优化。你会花费你所有的时间在这里或那里几毫秒(无论如何,这可能无关紧要),永远不会完成/启动一个产品。 – 2009-10-20 16:18:17

+0

你说得对 - 我放弃了不成熟的优化。我有一些结构不能真正由:include选项处理,因为多层次的多态关系。拿你的榜样。如果“订单”是一个多态对象,有时有线条,有时不是?这不是一个很好的例子,我承认,但是同样的,我提出了:包括无用的。 – Mario 2009-10-21 11:59:21

+0

现在已经有几年了,但是我现在有一个类似的小船,我有一个现有的应用程序,在页面加载时查询花费了30秒以上,这绝对是一个问题。我可以通过整理SQL大量减少这一点,但我无法在ActiveRecord一侧看到解决这个问题的方法。 – glenatron 2014-08-18 15:31:17