【问题标题】:How to call a method when creating new ActiveRecord object创建新的 ActiveRecord 对象时如何调用方法
【发布时间】:2015-08-13 14:25:57
【问题描述】:

我正在尝试将我用纯 Ruby 编写的算法集成到 Rails 应用程序中。我的 Ruby 项目的主类可以是资源。

当它在 Ruby 中初始化时,我立即在 initialize 方法中调用了一个函数:

def initialize(keyword)
  @keyword = keyword                    
  @sources = get_titles_of_sources                  
end

在 Rails 中,当我创建新对象时,我通常没有或至少看到initialize 方法。

@user = User.new(attribute1: value1, attribute2: value2)

但是这种风格不允许我在创建新对象时自动调用方法。

【问题讨论】:

  • 您是否希望在从 db 获取数据时也触发它?
  • 只有一次,在初始化之后直接。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

鉴于您在 cmets 中所说的话,我觉得您应该避免回调(顺便说一句,如果可以的话,您应该始终避免回调......)。

无论如何,我建议你创建一个build 方法,例如:

 class User 
   def self.build(props = {})
     new(props).tap do |user|
       #your code on initialize
     end
   end
 end

我通常倾向于将build 方法转移到构建器中。但它会让你创建一个额外的class

【讨论】:

  • 感谢您的替代解决方案。问题是我真的不明白那里发生了什么。 self.build 方法会覆盖 new 方法,还是我必须使用 User.build
  • 是的,您必须使用User.build({ attribute1: value1 })
  • 那么你为什么选择build 而不是new 甚至create
  • 因为使用不同的名称可以让您拥有自己的方法而不会覆盖现有方法。这样你就不会让任何人感到惊讶,并且你的代码仍然是意图揭示
【解决方案2】:

使用after_initialize 回调。

最后触发after_findafter_initialize 回调 每个由 finder 找到并实例化的对象,使用 after_initialize 在新对象实例化后触发 好吧。

Active Record Callbacks

【讨论】:

    【解决方案3】:

    听起来像是ActiveRecord Callbacks (http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html) 的用法。

    【讨论】:

      猜你喜欢
      • 2017-01-09
      • 2021-12-21
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多