2011-06-10 40 views
3

我在postgres中有一个名为updated_at的列。我试图让db默认设置时间。但Rails仍然执行查询updated_at = NULL。但是,当updated_at完全不在查询中时,postgres只会默认设置时间戳。Rails - 排除保存的属性

如何让Rails排除列?

+3

通过Rails惯例,表中的字段名为“updated_at”或“created_at”将在更新和创建操作期间由Rails在保存时设置。也许你在数据库中试图做的是与这种传统的行为相冲突。您可以尝试为自动更新字段指定不同的名称。 – Yardboy 2011-06-11 03:16:21

回答

0

您可以通过将ActiveRecord :: Base类变量 record_timestamps设置为false来禁用此行为。

在到config/environment.rb,导轨:: Initializer.run块:

config.active_record.record_timestamps = false 

(如果这不起作用,尝试代替的ActiveRecord :: Base.record_timestamps =假在文件的结尾)

如果你想为一个给定的模型只设置:

class Foo < ActiveRecord::Base 
    self.record_timestamps = false 
end 

感谢让 - François在http://www.ruby-forum.com/topic/72569

+0

虽然这可能会起作用 - 但您必须记住它也会破坏created_at的正常运行 - 这可能不是所期望的。另外 - 它会破坏*每个*模型的功能......不仅仅是问题中的模型。 – 2011-06-12 12:30:51

+1

它也可以应用于单个模型,请参阅第二个代码片段。 – KenB 2011-06-13 15:18:33

+0

感谢您的回复。 @ Jean-François,我已经在模型中尝试了您的建议,但查看我的日志仍显示updated_at仍在查询中。 – oprogfrogo 2011-06-13 20:00:50

0

我一直在Rails 2.2.2中遇到类似的问题。从这个版本开始,ActiveRecord中有一个attr_readonly方法,但是创建并不尊重它,只是更新。我不知道这是否在最新版本中发生了变化。我否认创建方法是强制尊重这个设置。

def create 
    if self.id.nil? && connection.prefetch_primary_key?(self.class.table_name) 
     self.id = connection.next_sequence_value(self.class.sequence_name) 
    end 

    quoted_attributes = attributes_with_quotes(true, false) 

    statement = if quoted_attributes.empty? 
     connection.empty_insert_statement(self.class.table_name) 
    else 
     "INSERT INTO #{self.class.quoted_table_name} " + 
     "(#{quoted_attributes.keys.join(', ')}) " + 
     "VALUES(#{quoted_attributes.values.join(', ')})" 
    end 

    self.id = connection.insert(statement, "#{self.class.name} Create", 
     self.class.primary_key, self.id, self.class.sequence_name) 

    @new_record = false 
    id 
end 

的变化只是为了打发false作为第二个参数attributes_with_quotes,并构建SQL时使用quoted_attributes.keys为列名。这对我有效。缺点是通过覆盖这个,你会失去before_create和after_create回调,并且我没有足够的时间来深入了解它的原因。如果有人关心扩展/改进这个解决方案或者提供更好的解决方案,那么我就是耳熟能详。