【问题标题】:How to retrieve values from a column called "object_id" in ActiveRecord?如何从 ActiveRecord 中名为“object_id”的列中检索值?
【发布时间】:2011-04-17 19:25:32
【问题描述】:

我需要通过 ActiveRecord 访问旧的关系数据库,并且该数据库使用名为“object_id”的列作为表中的主键。大多数事情都有效,但是当我尝试分别为关联(见下文)ActiveRecord 指定自定义 SQL 查询时,Ruby 解释器总是检索 Ruby 基础“对象”的 object_id 而不是数据库中的列值。

我在 has_many 声明中定义了以下 SQL 查询:

:finder_sql => "SELECT * FROM t_object WHERE object_id IN (SELECT end_object_id FROM t_object, t_connector WHERE t_object.object_id = #{object_id} AND start_object_id = #{object_id})

我已经尝试通过使用别名来解决它:

alias_attribute :my_oid, :object_id

并在 SQL 查询中使用“my_oid”。但我收到以下错误消息:

NameError: EaTObject 的未定义局部变量或方法“my_oid”(表不存在):类

我还定义了一个方法,它返回 read_attribute("object_id") 的值并将方法名称而不是 "object_id" 放入 SQL 查询中,但是当加载类时,我收到错误消息,该方法名称不是数据库表中的列名。

有没有办法访问名为“object_id”的列?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

    你可以使用这个方法:

    read_attribute(:object_id)
    

    文档中的链接:

    http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Read.html#method-i-read_attribute

    所以如果你想在调用 oid 时访问你的 object_id 列,你需要删除你的别名并定义 oid 方法

    def oid
      read_attribute(:object_id)
    end
    

    【讨论】:

    • 当我在 :finder_sql 中使用 #{read_attribute(:object_id)} 时出现错误“NoMethodError: undefined method `read_attribute' for EaTObject(Table doesn't exist):Class”。 >
    • 你的数据库中好像没有这张表
    • 我直接在数据库中使用 object_id 的具体值尝试了 SQL 查询,并且成功了。仅当我没有将列名放入 #{} 时,错误消息才会出现。
    • 我真的不明白你的情况。我们需要更多的代码来理解。更新您的问题或提出其他问题
    • 除了 read_attributes,你不需要其他东西。所以删除你的别名并在你的 oid 方法中只使用 read_attributes(:object_id)
    【解决方案2】:

    您可以在 SQL 中使用 t_object.object_id 来指定 object_id 字段,或者您可以为 t_object 表设置别名,例如

    :finder_sql => "SELECT * FROM t_object AS t WHERE t.object_id IN..."
    

    【讨论】:

    • 谢谢。我试过了,但没有用。在我看来,问题在于 SQL 查询中的#{object_id},因为它调用了 Ruby 类“Object”的继承方法 object_id,而不是 ActiveRecord::Base 生成的方法。我也无法用其他东西替换 #{object_id} 因为 ActiveRecord 需要 :finder_sql 中的列名。
    【解决方案3】:

    另一个选项是self[:object_id],但如果您收到“表不存在”,那么可能还有其他问题?

    编辑: 试试这个:

    :finder_sql => 'SELECT * FROM t_object WHERE object_id IN (SELECT end_object_id FROM t_object, t_connector WHERE t_object.object_id = #{id} AND start_object_id = #{id})'
    

    注意! 单引号。

    【讨论】:

    • 当我将 self[:object_id] 放入 :finder_sql 查询时,我会收到相同的错误消息。我直接在数据库中使用 object_id 的具体值尝试了 SQL 查询,它起作用了。只有当我没有将列名放入 #{} 时,错误消息才会出现。
    • object_idstart_object_id 是什么类型的?
    • 实际上,我认为您需要使用#{id} 而不是object_id,它会起作用。试试看
    • 谢谢,单引号是解决方案。
    【解决方案4】:

    如果您想像我一样执行选择,我建议为列名使用别名以使其按预期工作。 sql为数据库中的对象选择唯一的id号,如果你想选择值,你可以使用这个

    SELECT books.object_id as obj_id FROM books
    

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 2023-01-09
      • 2011-05-14
      • 2021-08-02
      • 2019-07-08
      相关资源
      最近更新 更多