Rails查找方法:选择别名为id?

时间:2011-07-01 11:09:39

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

我目前在我的一个rails控制器操作中有一个.find方法 - 相关部分是:

.find(:all, :select => 'last_name as id, last_name as name')

我在尝试将last_name列别名为id时遇到了一些奇怪的行为 - 如果我将其别名为别名,它可以正常工作(我可以last_name as xyz并输出名为xyz的列中的姓氏,但是当我使用它来填充我需要在id列中输入名称的下拉列表时,我需要将其称为“id”。

我应该指出它确实输出了一个id列,但始终是"id":0

有没有人能够明白我需要做些什么才能让这个列别名为'id'?

谢谢!

2 个答案:

答案 0 :(得分:2)

我不确定如何在Rails查询语句中执行此操作。 Rails将尝试接管id列,将数据库返回的值转换为id,其类型为id(可能是整数)。这就是为什么您的id列始终设置为0,因为"string".to_i #=> 0

然而,一旦你得到了结果,就有办法做到这一点。

由于您将问题标记为Rails 3,因此最好使用新的ActiveRelation语法。您可以执行以下操作:

# First, get the results from the query, then loop through all of them.
Customer.select("last_name as 'ln', last_name as 'name'").all.collect do |c|
  # The first step of the loop is to get the attributes into a hash form
  h = c.attributes
  # The next step is to create an "id" key in the hash.
  # The Hash#delete method deletes the key/value pair at the key specified and returns the value.
  # We'll take that returned value and assign it to the just created "id" key.
  h["id"] = h.delete("ln")
  # And we have to call out the hash to ensure that it's the returned value from the collect.
  h
end

这将为您提供一个散列,其中id值为文本字符串值last_namename值相同。

希望有所帮助!

答案 1 :(得分:1)

您不需要在finder SQL中设置别名只是为了填充下拉列表。而只需使用last_name值作为value属性(以及显示文本)。

例如,如果您正在使用collection_select助手:

<%= f.collection_select :attribute_id, @collection, :last_name, :last_name %>