2017-01-19 13 views
1

私は、間隔の開始が他の間隔の終わりと等しい場合、日付間隔を別の日付間隔とマージする方法を書いています。このメソッドをどのようにリファクタリングするのですか?

def merge 
    slots.each do |slot| 
    if self.start == slot.end 
     slot.end = self.end 
     slot.save 
     return self 
    elsif self.end == slot.start 
     slot.start = self.start 
     slot.save 
     return self 
    end 
    end 
    self.save 
end 

selfは、私がslots配列に存在する間隔のいずれかでそれをマージする間隔です。 この方法をリファクタリングするにはどうすればよいでしょうか?

ノー成功でこのような何かにそれを回すことを試みた:

def merge 
    slots.each do |slot| 
    if slot.one_bound == slot.other_bound 
     slot.other_bound = self.other_bound 
     slot.save 
     return self 
    end 
    end 
    self.save 
end 
+0

このメソッドは何を行うべきか説明できますか? 'スロット'とは何ですか?そして '自己 'は何ですか? – Stefan

+0

OK、質問を更新しました。 – Sajjad

+0

おそらく、 'merge'は' Range'クラスのインスタンスメソッドです。あれは正しいですか? 'slots'は範囲の配列を含むローカル変数のように見えます。もし' slots'が 'merge'メソッドに渡されず、' merge'で定義されていないので例外が発生します。 'self = 1..3'と' slots = [0..1、3..5] 'の場合、selfの値を' 0..5'に置き換えて返したいのですか? 'self = 1..2'と' slots 'が同じ場合、 '0..2'を返そうとしますか? 'self = 1..2'と' slots = [3..5、5..7] 'のときに何を返そうとしていますか? –

答えて

0

私は、これは、より読みやすいと思う:

def merge 
    slots.each do |slot| 
    if start_the_same_as_end_for?(slot) 
     slot.end = self.end 
    elsif end_the_same_as_start_for?(slot) 
     slot.start = self.start 
    end 

    slot.save 
    end 
end 

private 

def start_the_same_as_end_for?(slot) 
    self.start == slot.end 
end 

def end_the_same_as_start_for?(slot) 
    self.end == slot.start 
end 
0

あなたが範囲に演算子を追加するには、このgemを使用することができます。

# gem install range_operators 
require 'date' 
require 'range_operators' 

range1 = Date.new(2014, 5, 10) .. Date.new(2014, 8, 10) 
range2 = Date.new(2014, 8, 10) .. Date.new(2014, 8, 20) 
range3 = Date.new(2014, 8, 11) .. Date.new(2014, 8, 20) 

puts range1 + range2 
#=> 2014-05-10..2014-08-20 

ボーナスとして、2番目の範囲が正しい場合にも有効ですr最初の範囲:

puts range1 + range3 
#=> 2014-05-10..2014-08-20 

Range#は範囲の配列を返します。この配列に要素が1つしかない場合は、範囲がマージされたことを意味します。

result = range1 + range2 
if result.size == 1 then 
    # save result.first 
end 
関連する問題