我得到了一份我完全坚持的任务。
我有两节课:
#/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
答案 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
模型。这样你就不会尝试序列化/反序列化列表。