【问题标题】:Rails ActiveRecord not savingRails ActiveRecord 不保存
【发布时间】:2017-03-28 01:32:42
【问题描述】:

当我在 Rails 控制台中调用它时,这将返回我想要的数据库中的数据:

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

【问题讨论】:

  • 您能否更新此问题以包含您的 database.yml 文件内容?很有可能,rails 控制台正在更新数据库,而不是您期望的。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

您的问题出在 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 数据库中看到它们。

【讨论】:

  • 这就是问题所在,谢谢。我有点惊讶,没有给我一个错误。
  • @TylerMitchell 通常,ruby 允许您通过稍后在文件中再次声明它们来“覆盖”变量和函数声明。所以这种事情不会给你一个红宝石错误,即使它会给你一个其他语言的错误。 (这个功能是否是一个好主意是完全不同的故事,但你学会接受它。)
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
  • 2017-02-02
相关资源
最近更新 更多