Rails ActiveRecord不保存更新 - 但不会引发任何错误

时间:2014-01-10 16:55:06

标签: ruby-on-rails sql-server activerecord

我尝试使用sqlserver gem更新activerecord-sqlserver-adapter中的记录,当我尝试将记录保存在控制台中时,它显示为更新正常,但是当我检查数据库时没有更新任何内容。

class Customer < ActiveRecord::Base

 before_validation :make_CustomerID

 self.primary_key = :CustomerID
 self.table_name = "CoCustomers"

 def make_CustomerID
  self.CustomerID = Customer.all.last.CustomerID + 1
 end

end

在rails控制台中

c = Customer.find(1)
c.CustomerName
=> "ABC Co."
c.CustomerName = "XYZ Co."
=> "XYZ Co."
c.save

SQL (42.8ms)  BEGIN TRANSACTION
  Customer Load (49.9ms)  EXEC sp_executesql N'SELECT [CoCustomers].* FROM [CoCustomers]'
   (45.3ms)  EXEC sp_executesql N'UPDATE [CoCustomers] SET [CustomerName] = N''XYZ Co.'', [LastUpdate] = ''2014-01-10T16:37:52.488'' WHERE [CoCustomers].[CustomerID] = 3; SELECT @@ROWCOUNT AS AffectedRows'
SQL (45.6ms)  COMMIT TRANSACTION
=> true 
c.CustomerName
=> "XYZ Co."
c = Customerfind(1)
c.CustomerName
=> "ABC Co."

在节目中,好像它的更新,但实际上并没有发生任何事情,你可以看到。

另外我已将application.rb文件设置为

config.active_record.whitelist_attributes = false

我正在rails 3.2.16tiny_tds

使用activerecord-sqlserver-adapter 3.2.12

任何帮助都会很棒,谢谢

1 个答案:

答案 0 :(得分:2)

您不需要在before_validation之前挂钩make_customerID方法。 Rails将负责为您生成id。

请注意SQL更新语句中的id。这是三个。您正在检索ID。

编写Customer模型的方式,它将在每次验证时更新id。删除before_validation挂钩(和方法)。那应该为你解决。