在Rails中将业务逻辑类添加到另一个模型

时间:2016-01-17 01:34:06

标签: ruby-on-rails ruby ruby-on-rails-4

我得到了一份我完全坚持的任务。

我有两节课:

#/app/models/numbers.rb
class Numbers < ActiveRecord::Base
  # Model has(:id, :list_length, :number_list)

  # An array of integers
  serialize :number_list

  #generate the number list
  def create_list
    Array.new(self.list_length).map!{rand(100)}
  end

  def initialize(*params)
    super
    if !params.compact.empty?
      self.number_list = create_list
    end
  end

end

#/lib/update.rb
class Update
  #takes an array of integers
  def initialize(num_list)
    @num_list = num_list
  end

  def add_rand
    to_add = rand(10)
    @num_list.each{|n| n += to_add}
  end

  def get_list
    @num_list
  end
end

因此,Update必须保持库类,但我需要能够实例化一个Numbers对象,然后在其上调用Update类方法来更新num_list属性。

因此在创建Numbers对象之后,让我们将其称为@num_obj,我需要调用@ num_obj.add_rand然后将更新的@ num_obj.num_list数组保存到数据库中。

我可以随意添加助手和模块。经过几个小时的抨击,我完全迷失了,我确信这是一件简单的事情,我还没有学到(在我的搜索时间里可能会被忽略)。有人能指出我正确的方向吗?

编辑:经过更多阅读和一些建议后,我将Numbers类中的num_list更改为numbers_list以使事情更清晰

我添加了一个模块:

#/lib/num.rb
module Num
  def add_rand
    temp = Update.new(self.number_list)
    self.number_list = temp.add_rand
  end

  def get_list
    temp = Update.new(self.number_list)
    temp.get_list
  end
end

并将'include Num'添加到我的Numbers类。

现在我可以使用Numbers对象并在其上调用Update方法。 它有效,我不确定是否有更优雅的方式来做它....

编辑: 结果证明这是不对的。必须以某种方式保持更新,以便get_list方法返回Update的num_list

1 个答案:

答案 0 :(得分:0)

听起来您正在尝试将活动记录模型与如何更新它(业务逻辑)分开。您可能想要使用decorator pattern

之类的内容
class NumberUpdateDecorator < SimpleDelegator
  def add_rand
    number_list.each { |number| number += rand(10) }
    save!
  end
end

代码中的用法:

Numbers.find_each do |number|
  NumberUpdateDecorator.new(number).add_rand
end

此外,它可以简化将Numbers类更改为Number的操作。添加具有多个NumberCollection s的Number模型。这样你就不会尝试序列化/反序列化列表。