Tag: 回调

Rails 3 ActiveRecord .skip_callback线程安全

这段代码线程安全吗? MyModel.skip_callback(:save, :before, :my_callback) my_model_instance.update_attributes(attributes) MyModel.set_callback(:save, :before, :my_callback) 我可以安全地使用它来避免递归重新触发相同的回调吗? 这是一个例子 class Blog :active_theme_id_changed? # … private def update_blog_theme # Reuses a previously used BlogTheme or creates a new one blog_theme = BlogTheme.find_by_theme_id_and_blog_id( self.active_theme_id, self.id) blog_theme ||= BlogTheme.create!( :theme_id => active_theme_id, :blog_id => self.id ) Blog.skip_callback(:save, :after, :update_blog_theme) self.update_attributes!(:active_blog_theme_id => blog_theme.id) Blog.set_callback(:save, :after, :update_blog_theme) end end

在rails中,如何确定记录是否被依赖的:: destroy回调破坏?

我在我的Rails应用程序中有一个记录,其中包含一个after_destroy挂钩,需要知道记录被销毁的原因。 更具体地说,如果记录在级联中被破坏,因为它的父级表示dependent: :destroy ,它需要做的事情与记录被单独销毁时不同。 我试图做的是看它的父母是否被destroyed? ,只是为了弄清楚dependent: :destroy回调是在父被销毁之前完成的。 这是有道理的,因为它应该能够失败。 (即限制)。 那么,我该怎么做?

在Ruby on Rails中的模型中使用“current_user”

我正在使用Devise,它在助手中提供了“current_user”方法,因此我可以在视图和控制器中使用。 但是现在我想访问模型中的“current_user”方法。 这就是我现在在控制器中所拥有的。 def create set_email_address(params[:email_address]) Comment.new(params[:content], set_email_address) # [snip] end private def set_email_address(param_email) if current_user @email_address = current_user.email else @email_address = param_email end end 我想将“set_email_address”移动到一个模型,因为我认为这是一个逻辑,应该交给模型。 我打算用一个Rails回调来连接这个方法。

动态创建has_many或habtm的after_add和after_remove回调?

有没有办法动态地将after_add和after_remove回调添加到现有的has_many或has_and_belongs_to_many关系? 例如,假设我有模型User , Thing和连接模型UserThingRelationship ,而User模型是这样的: class User :user_thing_relationships end 我希望能够在扩展User的模块中添加:after_add和:after_remove回调到User.has_many(:things, …)关系。 即,有类似的东西 module DoesAwesomeStuff def does_awesome_stuff relationship, callback # or however this can be achieved… after_add(relationship) callback after_remove(relationship) callback end end 以便 class User :user_thing_relationships does_awesome_stuff :things, :my_callback def my_callback; puts “awesome”; end end 实际上是一样的 class User :user_thing_relationships, :after_add => :my_callback, :after_remove => :my_callback def […]

为什么after_find和after_initialize事件的回调是将它们定义为方法?

为after_find和after_initialize事件定义回调的唯一方法是将它们定义为方法。 如果你尝试使用第二种方法将它们声明为处理程序,它们将被默默地忽略。 任何人都能解释为什么会这样吗? 为什么专门为这两个回调? 编辑 从书中: – Rails必须使用reflection来确定是否有要调用的回调。 在进行真正的数据库操作时,与数据库开销相比,这样做的成本通常并不显着。 但是,单个数据库select语句可能返回数百行,并且必须为每个行调用两个回调。 这会显着减慢查询速度。 Rails团队认为,在这种情况下,性能胜过一致性。 我勒个去…!!!! 多数民众赞成……这就是解释…… !!!

如果before_action返回false,如何执行操作

我知道使用以下代码: before_action :signed_in?, only: [:new] 如果signed_in?将执行new动作signed_in? 返回true,但是如果我想在signed_in?时执行new操作signed_in? 返回false我该怎么办? 我是否必须创建一个名为not_signed_in?的新方法not_signed_in? ? 这是我的signed_in? 方法 def signed_in? !@current_user.nil? end

如何在Rails中组织复杂的回调?

我有一个Rails应用程序,它使用了很多回调..所以我有很多函数被调用:after_create和:after_commit在多个模型中。 我想知道我现在这样做的方式是最好的。 基本上我有以下场景: Class Parent “Richard The Lion Heart”) self.processed = true self.save! end end def last_function if self.processed? if !self.processing? self.process self.save! self.processing = true self.save! end end end end 所以你可以看到整个事情依赖于一些奇怪的双布尔检查,因为否则每次更新模型时都会调用second_function,并且它可以由函数本身更新,因此函数会被重复调用。 总的来说,它引出了我必须为每个回调引入一个新的布尔检查的情况。 它有效,但我不认为它优雅。 我错过了什么?

ActiveRecord after_initialize with select

当我尝试调用ActiveRecord方法时,我的两个Rails模型select它只返回错误object doesn’t support #inspect 这些模型使用after_initialize回调,因此我怀疑它与此有关。 我正在使用像这样的after_initialize回调: enum state: [ :archived, :active ] after_initialize :state_init after_initialize :date_init def state_init self.state ||= :active end def date_init self.report_date ||= self.event ? self.event.event_date : Date.current end 我需要使用select方法选择按月分组的记录,使用与Postgres有日期的字段 ModelName.select(“date_trunc( ‘month’, report_date ) as month, count(*) as count”).group(‘month’) 有什么方法可以解决这个问题吗?

处理版本时如何跳过carrierwave存储回调

我在我的video uploader类载波中定义了一个回调 after :store, :my_method 我有三个版本的文件。 original , standard , low my_method在每个版本处理时执行,即三次,我只需要回调执行一次。

了解Rails 4中的after_update回调

我有一个带有after_update回调的Rails对象, after_update记录发送到队列。 问题是我注意到有时队列的处理速度比对象实际更新的速度要快。 我的问题:在对象更新结束后调用after_update ,但是当它开始时? 如果我想在更新成功后才想用它做什么,我需要什么回调?