Rails - 从保存中排除属性

时间:2011-06-10 23:31:14

标签: ruby-on-rails

我在postgres中有一个名为updated_at的列。我正在尝试让db设置默认时间。但是Rails仍然执行查询updated_at = NULL。但是当update_at根本不在查询中时,postgres将默认设置时间戳。

如何让Rails排除列?

2 个答案:

答案 0 :(得分:0)

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

在config / environment.rb中,Rails :: Initializer.run阻止:

config.active_record.record_timestamps = false

(如果这不起作用,请在文件末尾尝试ActiveRecord :: Base.record_timestamps = false)

如果您只想为特定型号设置:

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

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

答案 1 :(得分:0)

我在Rails 2.2.2中遇到过类似的问题。从版本开始,ActiveRecord中有一个attr_readonly方法,但create不尊重它,只更新。我不知道最新版本是否有更改。我重写了create方法,强制是尊重这个设置。

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回调,而我没有时间深入研究它以找出原因。如果有人关心扩展/改进这个解决方案或提供更好的解决方案,我全都耳朵。