1

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

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']两者都有正确的数据类型,但我不知道该怎么做。

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

谢谢!

4

3 回答 3

0

这个对我有用。我这样做:

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​​ 函数。

于 2012-07-21T01:16:13.577 回答
0

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

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

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

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

SELECT CAST('156' AS INTEGER);

 int4 
------
  156
(1 row)
于 2012-07-22T03:40:11.423 回答
0

这有点晚了,但也许它可能有用。

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

从@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
于 2015-10-20T18:00:43.410 回答