Rails中的SQL调用,返回未由模型定义的对象

时间:2011-12-06 01:59:00

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

我知道如何调用SQL来从已定义的模型中选择数据,如下所示:

Friend.find_by_sql(["...."])

我的问题是,如果我需要模型未定义的信息,我该怎么办?

我有一个Meal表,Friend表和Component表。成分构成膳食,朋友可能对成分过敏。我有一个SQL命令(由于机密性原因,我不能在这里发布,但实际上并不相关),返回一个friend_id和component_id给定一个Meal。也就是说,它返回一个行列表(每行有两列,friend_id和component_id),告诉我哪些朋友对给定膳食中的哪些成分过敏。但我不知道如何将它存储在Ruby中的变量中并访问该信息。

给出一些伪代码让你知道我想做什么:

@allergies_for_a_meal = ....<INSERT SQL QUERY HERE>...
@friends_who_are_allergic = Friends.find_by_id(@allergies_for_a_meal.friend_id)

有人可以让我知道这个的正确语法吗?

2 个答案:

答案 0 :(得分:0)

如果您在ActiveRecord::Base子类(例如模型)中,那么您将可以通过connection访问当前数据库连接; connection包含有用的方法,例如select_rows

a = connection.select_rows('select id from ...').map { |r| r[0].to_i }

如果您不在模型类中,那么您真的不应该直接搞乱数据库,但如果必须,可以使用ActiveRecord::Base.connection

答案 1 :(得分:0)

您可以在数据库中创建一个SQL视图,然后创建一个只读的ActiveRecord模型来从中读取数据。

那样:

  • 您的复杂sql存储在dbms中(并且仅解析一次)。
  • 您可以使用所有常用的ActiveRecord访问器和查找器来访问数据
  • 您可以将其他查找约束添加到View的SQL

请注意,某些视图可以写入,具体取决于View的SQL,DBMS,引擎等。但我建议不要这样做。