如何强制返回的ActiveRecord属性类型:在连接表上选择短语?

tri*_*bes 5 activerecord select join ruby-on-rails type-coercion

遇到AR 2.3.5的问题,例如:

users = User.all( :select => "u.id, c.user_id", :from => "users u, connections c",
       :conditions => ... )
Run Code Online (Sandbox Code Playgroud)

返回,例如:

=> [#<User id: 1000>]
>> users.first.attributes
=> {"id"=>1000, "user_id"=>"1000"}
Run Code Online (Sandbox Code Playgroud)

请注意,AR返回id作为数字搜索的模型,但选择user_id的连接模型为a String,尽管两者都int(11)在数据库模式中.

我怎样才能更好地形成这种类型的查询来选择支持多个模型的表列并检索它们的自然类型而不是String?似乎AR正在这个地方撑船.如何在AR加载时强制返回类型,而不必.to_i在每个post-hoc访问上添加(等)?

Ram*_*ils 1

为什么在 User.method 中使用 :from => "users" ?以下将进行内部联接(无论如何,这就是您正在做的事情)

users = User.all(:include => :connections, :select => "users.id, connections.user_id", :conditions => {...})
Run Code Online (Sandbox Code Playgroud)

这对数据库来说将是非常繁重的查询。不过,使用外连接可以加快查询速度。

这也将返回键作为 INT 而不是 STRING

更快的替代方案是

Connection.all(:include => :user, :conditions => {...}).collect {|e| [e.user_id, e.id] }
Run Code Online (Sandbox Code Playgroud)

这将为您提供带有 id 的数组数组。如果您打算仅选择“id, user_id”列,那么它可能不一定是 AR 对象。数组可以更快。

我希望我没有遗漏一些要点。建议我,如果我是的话。