【问题标题】:Getting a field having `text` type获取具有“文本”类型的字段
【发布时间】:2013-07-22 14:14:47
【问题描述】:

Issue 类继承自 ActiveRecord(ruby 1.9.3p429(2013-05-15 修订版 40747)[x86_64-linux],Rails 3.2.13)。在这个类中,我尝试执行以下选择:

results = Issue.find_by_sql("select id, notes from mydb.issues;")
results.each do |r|
  puts r.notes.class.name
end

每一行的输出都是NilType

字段notes 的类型为text(MySQL,Ver 14.14 Distrib 5.5.31,debian-linux-gnu (x86_64) 使用 readline 6.2)。这是这个字段中的一些文本,我可以看到它 MySQL Workbench。

为什么会这样?如何正确访问这样的字段?

【问题讨论】:

  • 为什么要指定数据库名?
  • Issue 类中有什么相关的吗?
  • 返回的是 NilType 还是 NilClass?您能否包含一个“其中注释不为空”并查看它是否返回相同的消息?
  • @Frederick Cheung 感谢您的指点。原来Issue 类委托notes 方法。

标签: mysql ruby-on-rails ruby ruby-on-rails-3.2


【解决方案1】:

可能您已将notes 添加为attr_protected

  class Issue < ActiveRecord::Base
    attr_protected :notes
  end

  issue = Issue.new("notes" => "Some notes here")
  issue.notes # => nil

【讨论】:

    【解决方案2】:

    我认为你做错了,你已经从表中选择了所有笔记,现在你的结果对象包含数组中的所有笔记,所以你只需要循环遍历它:

    如果您有另一个“Note”模型,则必须这样做:

    results = Issue.find_by_sql("select * from mydb.issues;")
    results.each do |r|
      puts r.notes.class.name
    end
    

    或者,如果您的问题表中有注释字段,那么您应该这样做:

    results = Issue.find_by_sql("select notes from mydb.issues;")
    results.each do |r|
      puts r.class.name
    end
    

    希望它会有所帮助。谢谢

    【讨论】:

    • r.class.name 会返回 'Issue',r.notes.class.name 只会返回 'String'。
    • 记录集还包含一些其他文件。我已经编辑了我的问题以反映这一点。
    【解决方案3】:

    从数据库中检索单个列的正确方法是使用pluck。如果下面一行返回false

    Issue.pluck(:notes).any?{ |v| !v.nil? }
    # or, since you're using MySQL:
    Issue.where('notes IS NOT NULL').pluck(:notes).present?
    

    您可能遇到了一些严重的问题(指向另一个数据库的数据库连接,例如)

    【讨论】:

    • 记录集还包含其他字段,实际SQL非常复杂。为了简单起见,我已经减少了它。
    • 如果SQL很复杂,问题很可能是由于SQL的复杂性造成的,所以不可能只用它的一部分来调试它;此外,如果您发布的代码与给您带来问题的代码不一致,则很难为您提供帮助
    【解决方案4】:

    根据@Frederick Cheung 和@Salil 提供的指针,我发现Issue 类具有以下定义:

    delegate :notes, :notes=, :to => :current_journal, :allow_nil => true
    

    当然,在结果记录集中更改名称 notes 可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      相关资源
      最近更新 更多