【问题标题】:How does "select column as" work?“选择列为”如何工作?
【发布时间】:2013-04-30 09:37:13
【问题描述】:

我有一个包含很多关联的交易模型。关联之一是货币。交易表和货币表都有一个名称列。现在,我有以下 ActiveRecord 查询:

Deal.
  joins(:currency).
  where("privacy = ? or user_id = ?", false, doorkeeper_token.resource_owner_id).
  select("deals.name as deal_name, deals.date as deal_creation_date, deals.amount as deal_amount, currencies.name as currency_name, currencies.symbol as currency_symbol")

这个查询不起作用,它的结果是一个没有属性的 Deal 对象数组。根据 IRC 上的某个人的说法,“as”部分是不正确的,因为 ORM 不知道如何将列分配给哪个属性(或类似的东西)足够公平。我尝试添加 attr_accessor 和 attr_accessible 子句,但没有奏效。

请问我怎样才能使上述查询工作?我期望的结果是一个具有deal_namedeal_creation_date 等虚拟属性的 Deal 对象数组。

【问题讨论】:

    标签: ruby-on-rails select activerecord


    【解决方案1】:

    查询很可能工作正常,但由于 Deal 实现 inspect 方法的方式,返回的 Deal 对象在您打印出来时似乎没有任何属性。

    因此,如果您将查询结果分配给一个变量,您将看到它显示为空:

    v.each do |deal| ; puts deal.inspect ; end
    

    虽然这显示了您想要的属性:

    v.each do |deal| ; puts deal.to_yaml ; end
    

    更多详情请见this question

    【讨论】:

    • 好的,这对我有用。关联/联接除外。例如,采用以下查询:Deal.joins(:currency).where("deals.privacy = ? or deals.user_id = ?", false, 4).select("deals.name as deal_name, deals.date as deal_date, deals.amount as deal_amount, currencies.symbol as currency").as_json。在这个例子中,currencynil,尽管它不应该是(因为它在数据库中有一个值)。但是,它的值是一个特殊字符。是这个问题吗?
    • 可能是特殊字符导致了货币问题。您可以尝试将# encoding: UTF-8 放在文件顶部。 Here is an example 某人正在解决可能类似的问题
    • 我不明白的是,如果我不在 select 语句中使用“as”(包括 json 中的特殊字符),一切正常。所以我怀疑问题的根源是特殊字符......
    • 嗯。恐怕我不知道为什么会这样。
    • 好的,我设法(有点)查明了问题所在。如果我使用此查询:Deal.joins(:currency).where("privacy = ? or user_id = ?", false, 1).select("currencies.symbol as currency").as_json 所有货币都是零,但如果我使用该查询:Deal.joins(:currency).where("privacy = ? or user_id = ?", false, 1).select("currencies.symbol as currency_symbol").as_json 一切正常。这可能是关联的模棱两可问题。有道理。
    猜你喜欢
    • 2010-12-07
    • 2014-09-29
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多