2013-07-22 69 views
0

Issue继承自ActiveRecord(ruby 1.9.3p429(2013-05-15修订版本40747)[x86_64-linux],Rails 3.2.13)。在这一类我试图进行以下选择:获取具有`text`类型的字段

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,用于使用readline 6.2的debian-linux-gnu(x86_64))。这是该领域的一些文字,我可以看到它是MySQL Workbench。

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

+0

为什么指定数据库名称? – mdesantis

+1

问题类中看起来有关的任何东西? –

+0

它是否返回NilType或NilClass?你可以包括'哪里不是空的',看看它是否返回相同的消息? – Bala

回答

0

继@Frederick Cheung和@Salil提供的指针,我VE发现Issue类的定义如下:

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

当然,在结果记录更改名称notes解决了这个问题。

1

可能是你已经添加notesattr_protected

class Issue < ActiveRecord::Base 
    attr_protected :notes 
    end 

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

感谢您的指针!这是'代表'。 –

0

我认为你是错做它,你已经从你的表中选择所有的笔记,现在你的结果对象包含在阵列中的所有笔记,所以你通过它必须只循环:

如果您有其他“笔记”的模式,比你要做到这一点:

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

Ø r如果你的问题表中有笔记字段,则应该这样做:

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

希望它能帮上忙。谢谢

+0

r.class.name会返回'Issue',r.notes.class.name只会返回'String'。 – Bala

+0

记录集也包含一些其他文件。我编辑了我的问题来反映这一点。 –

0

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

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

很可能是你有一些严重的问题(数据库连接指向另一个数据库,FE)

+0

记录集也包含其他字段,实际的SQL非常复杂。为了简单起见,我减少了它。 –

+0

如果SQL很复杂,那么问题很可能是由于SQL的复杂性造成的,所以不可能仅使用它的一部分进行调试;此外,如果您发布的代码与提供问题的代码不一致,则很难为您提供帮助 – mdesantis