2015-06-01 73 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中傳入已知值,期望在方法輸出中具有特定的值)