标签: before-save

如何在不执行"before_save"的情况下"update_attributes"?

我有一个before_save在我Message这样定义模型:

   class Message < ActiveRecord::Base
     before_save lambda { foo(publisher); bar }
   end
Run Code Online (Sandbox Code Playgroud)

当我做:

   my_message.update_attributes(:created_at => ...)
Run Code Online (Sandbox Code Playgroud)

foo并被bar执行.

有时,我想更新消息的字段而不执行foobar.

例如,如何更新created_at字段(在数据库中)而不执行foobar

ruby-on-rails before-filter update-attributes ruby-on-rails-3 before-save

24
推荐指数
3
解决办法
3万
查看次数

Rails - 在before_save中获取旧值

我试图before_save通过在我的值中添加"_was" 来获得旧值,但它似乎不起作用.

这是我的代码:

before_save :get_old_title

def get_old_title
    puts "old value #{self.title_was} =>  #{self.title}"
  end
Run Code Online (Sandbox Code Playgroud)

"title_was"和"title"都获得了新标题.

是否有可能获得旧的价值before_save

ruby-on-rails before-save

11
推荐指数
3
解决办法
5945
查看次数

是:on =>:对Rails 3.2.3中的before_save回调创建有效

如您所知,before_save回调在before_create回调之前执行.

因此,有些人建议使用in before_save :method, :on => :create而不是before_create使得回调方法在适当的时间执行与其他回调(例如自动保存回调)相关.例如,请参阅此Pivotal Labs博客文章以及此StackOverflow答案.

但是,据我所知,该:on => :create选项无法实现对before_save回调的预期效果.换句话说,无论是否为创建,都会为每次保存执行回调.

:on => :create选项似乎是有效的before_validation回调,虽然.

有人可以确认是否:on => :create应该适用于before_save?它是否在以前的Rails版本中有效并且现在已经坏了,或者前面提到的链接是错误的?

假设:on => :create无效,以下是否可接受,和/或有更好的方法吗?

before_save :callback_method, :if => :new_record?
Run Code Online (Sandbox Code Playgroud)

谢谢.

activerecord ruby-on-rails before-save ruby-on-rails-3.2

8
推荐指数
1
解决办法
1万
查看次数

before_save,删除一个字符串

我正在尝试用户模型中strip变量的空格Username.

我正在使用

before_save do
  self.username.strip!
end
Run Code Online (Sandbox Code Playgroud)

但它似乎没有用,我错过了什么?

ruby-on-rails before-filter before-save ruby-on-rails-4

8
推荐指数
1
解决办法
2024
查看次数

Yii on update,检测onSave()上是否更改了特定的AR属性

我在模型的beforeSave上引发了一个Yii事件,只有在模型的特定属性发生变化时才会触发该事件.

我现在能想到如何做到这一点的唯一方法是创建一个新的AR对象并使用当前的PK查询旧模型的数据库,但这不是很好地优化.

这就是我现在所拥有的(注意我的表没有PK,这就是为什么我通过所有属性查询,除了我正在比较的那个 - 因此unset函数):

public function beforeSave()
{
    if(!$this->isNewRecord){ // only when a record is modified
        $newAttributes = $this->attributes;
        unset($newAttributes['level']);
        $oldModel = self::model()->findByAttributes($newAttributes);

        if($oldModel->level != $this->level)
            // Raising event here
    }
    return parent::beforeSave();
}
Run Code Online (Sandbox Code Playgroud)

有更好的方法吗?也许将旧属性存储在新的本地属性中afterFind()

php yii before-save

7
推荐指数
1
解决办法
6428
查看次数

before_save 中的 mark_for_destruction

这有什么问题before_save-callback

class Order < ActiveRecord::Base

    has_many :line_items, :dependent => :destroy, :inverse_of => :order
    accepts_nested_attributes_for :line_items  
    attr_accessible :line_items_attributes


    before_save :mark_line_items_for_removal

    def mark_line_items_for_removal
      line_items.each do |line_item|
         line_item.mark_for_destruction if line_item.quantity.to_f <= 0
      end
    end
end
Run Code Online (Sandbox Code Playgroud)

当其中之一line_items被标记为销毁时,line_item将不会保存。然而,父 Order 对象确实得到了保存。返回 true 并没有什么区别......

关于 mark_for_destruction:http ://apidock.com/rails/v3.1.0/ActiveRecord/AutosaveAssociation/mark_for_destruction 以及为什么不是“:allow_destroy => true”?见这里:http : //weblogs.manas.com.ar/spalladino/2010/03/15/deleting-children-with-accepts_nested_attributes_for-in-rails/

ruby ruby-on-rails before-save

6
推荐指数
1
解决办法
5245
查看次数

检查是否在before_save事件上修改或创建了模型

我想检查是否在Rails的before_save回调中创建了一个模型.我还想检查它是否已被修改(更新时).

谢谢

ruby ruby-on-rails ruby-on-rails-3.1 before-save rails-activerecord

6
推荐指数
1
解决办法
2358
查看次数

在维护文件结构时强制另存为XLSM

所以我正在使用XLTM文件,我希望用户确保它们保存为XLSM.当他们点击"保存"时,这工作正常,但我发现当他们点击"另存为"时,文件将保存为"*.xlsm.xlsm".我有点迷失了如何确保用户保存为XLSM,同时保持文件名为"filename.xlsm"而不是"filename.xlsm.xlsm".

    'Action makes sure the user saves as XLSM file type.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
    Dim FileNameVal As String 
    If SaveAsUI Then 
        FileNameVal = Application.GetSaveAsFilename(, "Excel Macro-Enabled Workbook (*.xlsm), *.xlsm") 
        Cancel = True 
        If FileNameVal = "False" Then 'User pressed cancel
            Exit Sub 
        End If 

        Application.EnableEvents = False 
        ThisWorkbook.SaveAs Filename:=FileNameVal & ".xlsm", FileFormat:=ThisWorkbook.FileFormat 
        Application.EnableEvents = True 
    End If 
End Sub 
Run Code Online (Sandbox Code Playgroud)

我认为问题可能是在写".xlsm":

ThisWorkbook.SaveAs Filename:=FileNameVal & ".xlsm", FileFormat:=ThisWorkbook.FileFormat 
Run Code Online (Sandbox Code Playgroud)

但是,如果没有写".xlsm",我会发现该文件保存为错误的文件后缀.(例如,如果我的XLTM文件名为Template(File001).xltm,并且用户打开一个新模板文件,它将另存为模板(File001)1(认为"1)1"是文件类型).

它可能是我的代码的结构,所以我需要指导如何修改它.

excel filenames vba excel-vba before-save

4
推荐指数
1
解决办法
3万
查看次数

如何知道在 Parse Cloud Code afterSave 钩子中的值是否改变?

每当我的对象的单个键的值在解析云代码afterSave挂钩中发生变化时,我都想发送推送通知。

Parse.Cloud.afterSave("Channel", function(request) {  
    var channel = request.object
    // TODO: check if value of channel key "state" was changed
});
Run Code Online (Sandbox Code Playgroud)

如何检查密钥的值是否state已更新?

这是我可以从request对象中获得的所有数据:http : //parseplatform.org/Parse-SDK-JS/api/v1.11.0/Parse.Cloud.html#.TriggerRequest

该线程中建议的解决方案感觉不对:Parse Javascript API Cloud Code afterSave with access to beforeSave values

我知道我可以通过beforeSave钩子中的脏方法来做到这一点。但是,这对我不起作用。为什么?如果我确实向许多用户发送推送通知,这需要一些时间。接收推送通知的客户端开始从服务器请求更新的频道对象。然而,他们可能会收到旧版本的对象,因为只要beforeSave尚未完成发送所有推送,通道对象就不会持久保存在数据库中。

javascript after-save before-save parse-cloud-code parse-server

4
推荐指数
1
解决办法
1155
查看次数

Yii2 保存前

我有一个控制器和一个用giiant生成的updateAction:

public function actionUpdate($id) {
    $model = $this->findModel($id);

    if ($model->load($_POST) && $model->save()) {
        return $this->redirect(['view', 'id' => $model->id]);
    } else {
        return $this->render('update', [
            'model' => $model,
        ]);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想通过覆盖模型中的 beforeSave 来重命名文件:

public function beforeSave($insert) {
    if ($this->isAttributeChanged('name')) {
        rename($this->getOldAttribute('name') . '.pdf', $this->name . '.pdf');
    }

    parent::beforeSave($insert);
}
Run Code Online (Sandbox Code Playgroud)

似乎模型已保存,但保存后仍呈现表单,实际上不可能。我确信这是因为beforeSave,因为如果我将其注释掉,一切都会正常。使用 beforeSave 怎么会导致这种不连贯的行为呢?我缺少什么?多谢!

php before-save yii2

4
推荐指数
1
解决办法
1万
查看次数