【问题标题】:How to turn off callbacks when changing virtual attribute?更改虚拟属性时如何关闭回调?
【发布时间】:2013-10-28 09:07:10
【问题描述】:

我的模型有一个“url”虚拟参数,链接上有大量数据。同一个模型有一个回形针附件:所以当一个新实例被创建时,它可以包含附件的数据或对象应该从哪里下载它的 url 字符串。我想封装所有检查是基于 url 的数据还是来自控制器的原始数据:

@music = @order.build_music(params[:soundtrack])
if @music.save
    format.html { redirect_to edit_order_path(@order) }
    format.js 
else
    format.html {render :action => 'new'}
    format.js
end

我要我的音乐模型检查是否设置了 url 虚拟参数,是否设置了异步下载:

has_attached_file :soundfile

after_save :check_if_url

def self.downloadSoundtrack(id, url)
    find(id).update_column(:soundfile, open(url))
end

private
    def check_if_url
        if self.url.present?
            Soundtrack.delay.downloadSoundtrack(self.id, self.url)
        end
    end

但是 update_column 不适用于虚拟参数,我不能使用 save '因为它会反复触发 after_save 回调。请帮助,伙计们!

【问题讨论】:

    标签: ruby-on-rails activerecord callback paperclip


    【解决方案1】:

    API Docs : save 的验证过程可以通过 validate: false 跳过。

    【讨论】:

    • 是的,没错。 validation 将被跳过,但我需要 after_save 回调被跳过
    【解决方案2】:

    试试这个,它不会触发回调

    Model.where(id: id).update_all(soundfile: open(url))
    

    【讨论】:

    • 只是为了澄清问题:声音文件不是数据库字段 - 它是由回形针虚拟属性创建的。所以我认为 update_all 不会起作用
    猜你喜欢
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    相关资源
    最近更新 更多