2015-06-01 58 views
0

我有一种方法在我的模型中返回数据,这些数据将被输入到制图宝石中。方法应该去哪里(模型?,在别的地方)

class MyModel < ActiveRecord::Base 
    def ownership_data 
     format_data(item_ownerships.group(:owned).count) 
    end 
end 

我需要保证数据返回结果中总是有2个值。是这样的:

{ “是”=> 4, “否”=> 2}

为了做到这一点,我写这是在第一方法中使用的另一种方法:

def format_data(values) 
    values[false].nil? ? values = values.merge({ "no" => 0 }) : true 
    values[true].nil? ? values = values.merge({ "yes" => 0 }) : true 

    return values 
end 

我的问题是,这种方法应该去哪里,我该如何使用rspec进行单元测试?目前我已经得到了它的模型,然而在试图使用RSpec来测试它,我的规格如下所示:

let(:values) { { "yes" =>2 } } 

it "it will return 2 values" do 
    result = MyModel.new.format_data(values) 
    expect(result.keys.count).to eq(2) 
end 

我不是太高兴不必实例模型的实例来测试这个。任何指导表示赞赏。

+0

您已经将此问题泛化了一些,很难说出方法的用途。图书馆,或API,或你的意见,这将告诉你可以把方法放在哪里 – AJFaraday

+1

我要说的是AModel.new是一个非常“便宜”的方法来调用,它不查询或保存到数据库,因此它没有实例化的重要成本 – AJFaraday

+0

该方法所做的是采用ActiveRecord查询item_ownerships.group(:owned).count的结果,如果它只有一个值(仅“yes”或只有“否”),为其添加第二个值,以便它始终包含“是”和“否”的值。严格控制活动记录查询的结果。 – Agazoom

回答

2

正如AJ在评论中提到的那样,我们可能需要更多信息才能提供更具体的建议。我会给一些...

如果你有一个对象不一定取决于模型本身,你应该考虑把它移动到plain old ruby objectservice object。这些可以存在于单独的文件夹(lib/services)或模型文件夹中,而不需要继承ActiveRecord::Base

您的方法也可以是类方法def self.method_name(values, values_2)而不是实例方法(如果您不需要模型中的特定值)。

当谈到为我的项目进行报告的数据操作时,我已经为'lib/reports'下的那些人构建了特定的ruby服务对象文件夹,他们获取原始数据(通常在init方法中)并返回格式化数据一个方法调用(如果可以在不同的输出选项中格式化相同的数据,则允许我进行多个调用)。这使得它们与模型分离。此外,这使得测试变得简单(在Class.new中传入已知值,期望在方法输出中具有特定的值)