【问题标题】:Force Datatype in ActiveRecord with Select使用 Select 强制 ActiveRecord 中的数据类型
【发布时间】:2012-07-21 00:03:30
【问题描述】:

我正在运行一个包含连接和冲突列名的查询。即:

results = TableA.joins(:table_b).select('table_a.id as table_a_id', 'table_b.id as table_b_id')

在我的结果中,table_a_id 和 table_b_id 都是字符串。我该怎么做才能使它们成为整数?

我觉得可能有办法让它返回 results[0]['table_a']['id']results[0]['table_b']['id'] 两者都有正确的数据类型,但我不知道该怎么做。

我主要关心的是如何做到这一点,这样我就可以在不运行第二个查询的情况下访问这两个列。

谢谢!

【问题讨论】:

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


    【解决方案1】:

    它对我有用。我这样做:

    comments = Comment.joins(:project).select('comments.id as table_a_id, projects.id as table_b_id')
    

    我可以这样做:

    comments.first.table_a_id
    

    要将列转换为整数,您可以使用 sql 函数。要转换为整数,您可以使用 sql 或 ruby​​ 函数。

    【讨论】:

      【解决方案2】:

      由于豆桂的回答几乎涵盖了访问这两个列,因此我将仅解决字符串到整数的转换。 您有两种选择,用 SQL 或 Ruby 转换。

      在 Ruby 中,您可以在字符串上调用 .to_i 以将其转换为整数,因此:

      > foo = '156'
      => '156'
      > foo.to_i
      => 156
      

      在 SQL 中,您使用 CAST 函数,因此:

      SELECT CAST('156' AS INTEGER);
      
       int4 
      ------
        156
      (1 row)
      

      【讨论】:

      • 所以我的问题是当我.select() 特定列时,即使是整数类型的列也会作为字符串返回到 Rails。这是正常行为吗?
      • 嗯,是的,这似乎确实发生了。以前从未注意到它。我猜你在事后坚持将字符串转换为整数。
      【解决方案3】:

      有点晚了,但也许有用。

      我遇到了同样的问题,我解决了这样的问题:

      从@Dougui的回答开始,可以强制table_b_id类型定义:

      class TableA
        def [](name)
          if name.to_sym == :table_b_id
            super.to_i
          else
            super
          end
        end
      
        def method_missing(name, *args)
          if name.to_sym == :table_b_id && args.empty? && !block_given?
            super.to_i
          else
            super
          end
        end
      end
      

      【讨论】:

        猜你喜欢
        • 2010-12-24
        • 1970-01-01
        • 2021-06-21
        • 2016-03-29
        • 2013-02-21
        • 2012-06-20
        • 2020-08-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多