2011-08-31 104 views
1

我想在我的User模型中有一个称为feed的方法,它返回两个表(讨论,交换)中的所有条目。如何在ruby方法中编写SQL?

在User.rb

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

这是不行的,我得到了铁轨控制台问题

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

谁能告诉我怎么写SQL语句会在这里?基本上我想返回,并从两个不同的表进行排序项..

+0

您需要提供表字段,以便能够写出正确的SQL声明。 – Andrey

回答

2

如果你想实际ActiveRecord对象,你可以试试下面的

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

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

这是相当无效的,因为排序可以在SQL中完成,但ActiveRecord无法实例化从不同表格中选择的记录(您可以用某种方法通过使用STI覆盖此项)

+0

谢谢 - 祝你有个美好的一天 – jay

2

首先,您不能只在您的ruby代码中编写普通SQL,并期望它能够工作。

这是ruby,而不是SQL。他们是不同的语言。 如果可以的话 - 使用ruby-way和关联来代替(按照另一个例子)。但是 - 如果你迫切需要使用原始SQL(例如,你的legavy表与模型不匹配,或者在SQL中有一些复杂的组合逻辑,不容易映射到关联)。那么你需要传递SQL到数据库......这意味着使用通过Active Record的连接。

尝试:

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

它不会给你回款的红宝石 - 只是一个原始结果对象。 我建议在脚本/控制台中尝试一下,然后执行“puts my_user.feed.inspect”来查看它返回的类型,以便知道如何使用它。

注:这种东西的存在被认为是一个强大的代码味道 - 只使用它,你真的需要它

+0

:)然而你在你的代码中试过了...... 这就是为什么我回答并解释了为什么它不能这样工作 –