2013-07-22 70 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