1

在控制器中我的代码是

query = "insert into users (name, email,updated_at) values (#{name},#{email},now()) ON DUPLICATE KEY UPDATE updated_at=now()"

User.connection.execute(查询)

在模型中

after_create :change_updated_at

    def change_updated_at
     if !self.email.blank?
       chk_user = User.find_by_id(self.email)
       if !chk_user.blank? && chk_user.updated_at.blank?          
          chk_user.updated_at =Time.now
          chk_user.save!
       end
     end

end

但它不起作用请帮忙

4

3 回答 3

0

不要直接运行您的查询,这非常不正常。让 rails 为您生成查询。通过自己运行,rails 无法知道您已经创建了记录,因此after_create不会调用过滤器。

将您的代码更改为:

User.create(name: name, email: email)

然后它会运行。另外,不要自己更新“create_at”字段。如果您使用 rails 方法,它也会自动为您执行此操作:)

于 2013-04-19T07:13:09.410 回答
0

您需要使用 params 对象输入属性。所以首先你需要新方法,然后创建方法(如果你对模型使用标准表单助手):

def create
@user=User.new(params[:user])
#other code
end
于 2013-04-19T07:19:31.897 回答
0

您的查询应该替换为类似的内容。这将提供与使用 ON DUPLICATE KEY UPDATE 相同的功能

user = User.where("name = ? and email = ?", name, email)
if user.nil?
    user = User.new 
end
user.name = name
user.email = email
user.save

因为您希望此功能即使是更新也能运行。您想使用after_save回调http://apidock.com/rails/ActiveRecord/Callbacks/after_save

仅在after_create创建全新对象时调用。 http://apidock.com/rails/ActiveRecord/Callbacks/after_create

活动记录提供的所有回调列表在这里 http://apidock.com/rails/ActiveRecord/Callbacks

于 2013-04-19T07:30:21.723 回答