如何在ruby方法中编写SQL?

时间:2011-08-31 13:50:11

标签: sql ruby-on-rails ruby-on-rails-3

我想在我的User模型中有一个名为feed的方法,它返回两个表(讨论,交换)中的所有条目。

在User.rb中

 def feed
    SELECT * FROM discussions, exchanges GROUP BY created_at
 end

这不起作用,我在rails console中遇到问题

 syntax error, unexpected ';', expecting '='

有谁能告诉我如何在这里写SQL?基本上我想返回并从两个不同的表中对条目进行排序..

2 个答案:

答案 0 :(得分:3)

如果您想要实际的ActiveRecord对象,可以尝试以下

def feed
  exchanges = Exchange.all
  discussions = Discussion.all

  (exchanges + discussions).sort! { |a, b| a.created_at <=> b.created_at }
end

这是非常无效的,因为排序可以在sql中完成,但ActiveRecord无法实例化从不同表中选择的记录(您可以通过使用STI以某种方式覆盖它)

答案 1 :(得分:3)

首先 - 您不能只在Ruby代码中编写纯SQL,并期望它能够正常工作。

这是红宝石,而不是SQL。他们是不同的语言。 如果可以 - 使用带有关联的ruby-way(根据另一个例子)。

但是 - 如果你迫切需要使用原始SQL(例如,你有一些与模型不匹配的legavy表,或者在SQL中有一些复杂的组合逻辑,它们不容易映射到关联);那么你需要将SQL传递给数据库......这意味着通过Active Record使用连接。

尝试:

def feed
  ActiveRecord::Base.connection.execute("SELECT * FROM discussions, exchanges GROUP BY created_at")
end

它不会为您返回ruby模型 - 只是一个原始结果对象。 我建议在脚本/控制台中尝试这个,然后执行“put my_user.feed.inspect”来查看它返回的内容,以便你知道如何使用它。

注意:这种东西的存在被认为是强烈的代码味道 - 只在你真正需要它的地方使用