我目前在我的一个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'?
谢谢!
答案 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_name
,name
值相同。
希望有所帮助!
答案 1 :(得分:1)
您不需要在finder SQL中设置别名只是为了填充下拉列表。而只需使用last_name值作为value属性(以及显示文本)。
例如,如果您正在使用collection_select助手:
<%= f.collection_select :attribute_id, @collection, :last_name, :last_name %>