2017-03-27 30 views
0

當我把它在軌道控制檯這將返回我從我的數據庫所需的數據:Rails的ActiveRecord的不節能

class VendorFinding < ActiveRecord::Base 
    self.table_name = "vendor_findings" 
    self.primary_key = "vendor_findings_id" 

    def self.getReleventData() 
     return VendorFinding 
     .select([:ContactPerson, :contact_email]) 
     .where(Status: "Open") 
    end 
end  

但是,當我嘗試插入/更新行它假裝一切都很順利,但是當我檢查數據庫沒有新的記錄。
Rails的控制檯例子:

irb(main):004:0> myFinding = VendorFinding.new 
=> #<VendorFinding vendor_findings_id: nil, ContactPerson: nil, contact_email: nil, Status: nil> 

irb(main):007:0> myFinding.ContactPerson = "Myself"                  
=> "Myself" 
irb(main):008:0> myFinding 
=> #<VendorFinding vendor_findings_id: nil, ContactPerson: "Myself", contact_email: nil, Status: nil> 
irb(main):009:0> myFinding.save 
    (1.9ms) SAVEPOINT active_record_1 
    SQL (1.9ms) INSERT INTO `vendor_findings` (`ContactPerson`) VALUES ('Myself') 
    (1.8ms) RELEASE SAVEPOINT active_record_1 
=> true  
irb(main):012:0> VendorFinding.where("ContactPerson = 'Myself'")              
    VendorFinding Load (3.2ms) SELECT `vendor_findings`.* FROM `vendor_findings` WHERE (ContactPerson = 'Myself') 
=> #<ActiveRecord::Relation [#<VendorFinding vendor_findings_id: 905, ContactPerson: "Myself", contact_email: nil, Status: nil]> 

它假裝它更新了數據庫,但是當我檢查MySQL數據庫,記錄不存在,並記錄計數總的是一樣的操作之前。在數據庫端沒有進行驗證,參數的類型是VARCHAR(65),除了id,它是INT。

我對rails很陌生,想要讓ActiveRecord與仍在使用的遺留數據庫進行交互,所以我無法修改列名以適應rails慣例。有沒有其他的方法可以幫我做到這一點?或者,也許這不是問題。

提前感謝您的時間。

更新與database.yml文件:

development: 
    adapter: mysql2 
    host: <dbname>.db.<corpname>.com 
    port: 8200 
    database: Safety 
    encoding: utf8 
    collation: utf8_general_ci 
    pool: 5 
    <password_stuff_removed_for_stack_overflow> 

    adapter: sqlite3 
    database: ":memory:" 

beta: 
    adapter: mysql2 
    host: <dbname>.db.<corpname>.com 
    port: 8200 
    database: Safety 
    encoding: utf8 
    collation: utf8_general_ci 
    pool: 5 
    <password_stuff_removed_for_stack_overflow> 

production: 
    adapter: mysql2 
    host: <dbname>.db.<corpname>.com 
    port: 8200 
    database: Safety 
    encoding: utf8 
    collation: utf8_general_ci 
    pool: 5 
    <password_stuff_removed_for_stack_overflow> 

test: 
    adapter: sqlite3 
    database: db/test.sqlite3 
+3

你能否更新這個問題以包含你的database.yml文件內容?更有可能的是,rails控制檯更新數據庫,而不是你期望的那個。 – eiko

回答

2

您的問題是在database.yml中的這一部分:

development: 
    adapter: mysql2 
    host: <dbname>.db.<corpname>.com 
    port: 8200 
    database: Safety 
    encoding: utf8 
    collation: utf8_general_ci 
    pool: 5 
    <password_stuff_removed_for_stack_overflow> 

    adapter: sqlite3 
    database: ":memory:" 

這段代碼的第一部分將開發數據庫是相同的作爲您的生產數據庫。然後,代碼的第二部分將覆蓋您之前的設置,並將數據庫設置爲database: ":memory:",這基本上是臨時數據庫,只要連接關閉,該數據庫就會被刪除。

您可以修復它,如下所示:

development: 
    adapter: sqlite3 
    database: "db/development.sqlite" 

這將創建一個使用SQLite一個空的開發數據庫。您將能夠通過訪問sqlite數據庫來查看這些更改。但是,除非您在生產模式下運行代碼,否則您將在您的生產mysql數據庫中看到它們而不是

+0

這就是問題,謝謝。我有點驚訝,不會給我一個錯誤。 –

+0

@TylerMitchell通常ruby讓你''覆蓋'變量和函數聲明通過稍後再次在文件中聲明它們。所以這樣的事情不會給你一個紅寶石錯誤,即使它會給你在其他語言的錯誤。 (不管這個功能是不是一個好主意,完全是一個完全不同的故事,但是你學會了忍受它。) – eiko

相關問題