2013-01-31 16 views
-1

我有兩個實例值:@a和@b,有散列樣...... (將在僞例子中解釋) 例如在@ai中有:Ruby從實例變量中扣除與其他值相同的值

*Field1 | Field2 | Field3* 

CONTITECH | CT942K1 | 123 
CONTITECH | CT722K1 | 123 
ATE | AB2123 | 123 
在@bi

有:

CONTITECH | CT942K1 | 456 
BREMBO | TE132 | 123 

如何做到這一點@c = @a - @b將只包含其不在@b值?

例如@c = @a - @b將包含:

CONTITECH | CT722K1 | 123 
ATE | AB2123 | 123 

所以只有2場是一樣的,我必須從@b @a相同的值刪除...

如果沒有通過示例清除,請寫評論....我需要的僅僅是從@a中刪除@a中所有相同的(field1和field2)條目... 如何做到這一點?

這將幫助:代碼: 這是@b(@articles):

@articles = Article.find(:all, :conditions => ["ART_ID in (?) ", @search.map(&:ARL_ART_ID)]) 

和@a(@non_original):

@non_original = [] 
    nr_condition = "*" + art_nr.to_s.gsub(/[^0-9A-Za-z]/, '').upcase + "*" 
    if art_nr.length > 3 
     art = search_not_oem(art_nr) 
     @search = CrossList.find(:all, :conditions => ['MATCH (cross_value) AGAINST (? IN BOOLEAN MODE)', nr_condition]) 
     if @search.present? 
     @prlist = PriceList.where("id IN (?)", @search.map(&:price_list_id)) 
     if @prlist.present? 
      @prlist.each do |p| 
      #@all_supp = Supplier.all 
      #if @all_supp.find{|item| item.SUP_BRAND.gsub(/[^0-9A-Za-z]/, '').include?(p.brand.gsub(/[^0-9A-Za-z]/, '').upcase)} && art.present? 
      # logger.warn("!!!!!! if") 
      #else 
       @non_original << p 
      #end     
      end 
     end 
     end 
    end 
@non_original 

什麼,我需要的是@res = @non_original - @articles,當然他們有不同的領域,但有相同的數據...

+1

爲什麼不給出設置@a和@b的實際ruby代碼以及b的結果,而不是僞代碼? –

+0

@FrederickCheung你會在那裏看到什麼?全部在db?代碼很大,不會顯示任何...。 –

+0

@FrederickCheung添加 –

回答

0

試試這個:

@res = @non_original.reject do |obj| 
    @articles.any? {|art| art.field1 == obj.field1 && art.field2 == obj.field2 } 
end 

這應該投入@res所有物體從@non_original,除了那些field1field2比賽中@articles的任何元素。 @res中的對象將與@non_original相同 - 即PriceList

+0

是的,操作系統不錯....只是我還需要一些東西來編輯...但首先看起來不錯 –