【问题标题】:SQL call in Rails, return object that isn't defined by a modelRails 中的 SQL 调用,返回模型未定义的对象
【发布时间】:2011-12-06 01:59:00
【问题描述】:

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

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

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

我有一张 Meal 表、Friend 表和 Component 表。组件组成膳食,朋友可能对组件过敏。我有一个 SQL 命令(由于保密原因,我不能在此处发布,但无论如何实现并不那么相关),它返回一个朋友 ID 和组件 ID,给定一顿饭。也就是说,它返回一个行列表(每列有两列,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)

有人可以告诉我正确的语法吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • @varatis: 不,a 只会包含 Fixnums,而不是模型实例或类似的复杂内容。
    • 好的,那么我该如何访问它们呢?抱歉,我对 Ruby 很陌生
    • @varatis: 如果只有一个,那么a[0]
    【解决方案2】:

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

    这样:

    • 您的复杂 sql 存储在 dbms 中(并且只解析一次)。
    • 您可以使用所有常用的 ActiveRecord 访问器和查找器来访问数据
    • 您可以向视图的 SQL 添加附加查找约束

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

    【讨论】:

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