【问题标题】:Rails Custom Model FunctionsRails 自定义模型函数
【发布时间】:2010-12-18 18:09:13
【问题描述】:

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

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

那么问题就变成了:

  1. 如何在模型中执行手动创建的查询?
  2. 如何将结果填充到一个空对象中,然后我可以返回并在视图中使用?

另外,我知道这是多么糟糕的做法,我现在只是不想在 PHP 中重新开始。

【问题讨论】:

  • 我很抱歉,但现在几乎每个框架都有某种 ORM - 例如看 Doctrine。 ActiveRecord 甚至不能很好地隐藏 SQL - 您可以将 SQL 作为条件/组/连接选项的一部分编写。
  • ActiveRecord 甚至没有尝试隐藏 SQL。阅读 Rails 的创建者 David Heinemeier Hansson 在Agile Web Development with Rails book 的第 315 页上所说的话:“[Active Record] 建立在 SQL 既不脏也不坏,只是在琐碎情况下冗长的概念之上。重点是无需在那些琐碎的情况下处理冗长的问题(手动编写一个 10 属性的插入会使任何程序员感到疲倦),但保持硬查询的表现力——创建 SQL 类型是为了优雅地处理。”跨度>

标签: sql ruby-on-rails ruby model


【解决方案1】:

我想,你应该知道2-3个真正必要的方法,才能使用它。 (假设我们至少有 2 个模型,Order 和 User(customer for order)) 例如,只需在您的数据库上运行查询,请使用:

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

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

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​​ 对象的数组。

【讨论】:

    【解决方案2】:

    假设您有购买商品

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

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

    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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-28
      相关资源
      最近更新 更多