Rails自定义模型函数

时间:2009-11-20 14:39:47

标签: sql ruby-on-rails ruby model

我在数据库课程中,教师希望我们开发一个电子商务应用程序。她说我们可以使用我们喜欢的任何框架,现在我们已经在学期中途,她认为Rails做得太多了,并希望我明确地编写我的SQL查询。

所以,我想做的是编写我自己的函数并将它们添加到模型中,以基本上复制已有的功能(但我自己编写的SQL)。

所以问题就变成了:

  1. 如何在模型中执行手动创建的查询?
  2. 如何将结果填充到一个空对象中,然后我可以在视图中返回并使用它?
  3. 另外,我知道这是多么可怕的做法,我现在不想在PHP中重新开始。

2 个答案:

答案 0 :(得分:4)

我认为,你应该知道2-3个必要的方法,才能使用它。 (假设我们至少有2个型号,订单和用户(客户订购)) 例如,只需在数据库上运行查询,请使用:

Order.connection.execute("DELETE FROM orders WHERE id = '2')

从数据库中获取对象的数量,最好的方法是使用方法“count_by_sql”,它是可扩展的。我在我的项目中使用它,其中表有超过500,000条记录。所有计算应用程序的工作都给数据库带来了好处,它比app更有效率。

Order.count_by_sql("SELECT COUNT(DISTINCT o.user_id) FROM orders o")

此查询获取所有拥有订单的uniq用户的数量。我们可以“加入”表格,使用“ORDER BY”和组结果订购结果。

和最经常使用的方法:find_by_sql

Order.find_by_sql("SELECT * FROM orders")

它会返回一个带有ruby对象的数组。

答案 1 :(得分:2)

假设您有购买

class Purchase < ActiveRecord:Base
    def Purchase.find(id)
        Purchase.find_by_sql(["Select * from purchases where id=?", id])
    end  
end 

也许您想要特定购买的产品。您可以在购买模型中手动定义purchase_items。

class Purchase < ActiveRecord:Base
    def purchased_items
        PurchasedItem.find_by_sql(["Select * from purchased_items where purchase_id=?",self.id])
    end
end

例如,在您的控制器中,您现在想要购买特定购买的商品,现在可以执行此操作

@purchase = Purchase.find(params[:id])
@purchased_items = @purchase.purchased_items

如果需要与数据库建立更原始的连接,可以查看ActiveRecord:Base.connection.execute(sql)