2016-05-25 5 views
2

Ich brauche sekundäre Bilder für ein Produkt (das könnte bis zu 10 Bilder), aber ein bisschen ein Problem haben. Wo das Problem liegt, ist secondary_images/#{id}_20.jpg. Die _20 könnte alles von _1 bis _11 und _01 bis _30 sein. Leider waren die Bilder, wenn sie in das System eingefügt wurden, nicht hundertprozentig mit der Namenskonvention übereingestimmt. Ich würde die Namen ändern, aber es gibt über 50.000 Bilder. Was wäre der richtige Weg, um dies zu erreichen?Ruby - Finden Sie die Endung eines Dateinamens innerhalb bestimmter Parameter

* Dieser Code funktioniert, wenn die secondary_images/#{id} in _20 endet.

def image_url(type = nil) 
    no_image = type.nil? ? 'no-image-lg.png' : 'no-image.png' 
    return "//img#{rand(0..9)}.foo.com/#{no_image}" unless has_image? 

    require 'net/http' 
    id = sprintf('%07d', master_product_id) 
    url = if type == 'secondaries' 
     "//img#{rand(0..9)}.foo.com/product_images/secondary_images/#{id}_20.jpg" 
     elsif type == 'thumbnail' 
     "//img#{rand(0..9)}.foo.com/product_images/thumbnails/#{id}.jpg" 
     else 
     "//img#{rand(0..9)}.foo.com/product_images/#{id}.jpg" 
     end 
    url = URI.parse(URI.encode(url.to_s)) 
    req = Net::HTTP.new(url.host, url.port) 
    res = req.request_head(url.path) 

    res.code == '200' ? url.to_s : "//img#{rand(0..9)}.foo.com/#{no_image}" 
    end 

    def images 
    images = {} 

    images['main'] = image_url 
    images['thumbnail'] = image_url 'thumbnail' 
    images['secondaries'] = image_url 'secondaries' 
    images.to_dot 
    end 

Danke Jungs!

+0

einige Proben zur Verfügung stellt, nicht nur eine Erklärung für das Dateinamensschema. Was erwartest du als Output? Ich würde empfehlen "[ask]" und "[mcve]" zu lesen. Ihr Code muss ausführbar sein und das Problem demonstrieren. Ich würde empfehlen, es auf das Nötigste zu reduzieren, das notwendig ist, um _only_ zu demonstrieren, wonach Sie fragen. Das Anzeigen der HTTP-Verarbeitung ist nicht hilfreich. –

+0

Nach welcher Stichprobe suchen Sie? Was die '# {id}' sein könnte? Es ist wirklich willkürlich, es könnte alles sein. Es geht mir darum, wie man den Ordner mit den Parametern '_1' bis' _11' oder '_01' bis' _30' durchsucht. Ich könnte den ganzen anderen Code herausnehmen und einfach die fragliche Zeile einfügen, aber andere könnten etwas davon nützlich finden. – skreebidedeep

+0

Vielleicht könnte eine Art Regex den Trick machen? – skreebidedeep

Antwort

0

Es ist nicht schön, aber Sie können die folgende Regex verwenden, um die entsprechenden Ziffern zu entsprechen.

/.*(([1-9])|(0[1-9])|([1-3]\d))\.jpg\b/ 

Hier ist ein Beispiel:

https://regex101.com/r/gJ2jU7/1

+0

Danke! Ich werde es ausprobieren! – skreebidedeep

0

Es ist wirklich schwer zu sagen, was Sie wollen, aber es wird vielleicht helfen zu wissen, dass Ruby-Routinen enthält, die es leicht zu bekommen auf den Dateinamen machen in einem Pfad. Sobald Sie das haben, ist es leicht, Teile des Namens zu extrahieren, da es sich um eine String-Manipulation handelt.

def get_image_num(fname) 
    File.basename(fname, File.extname(fname)).split('_').last 
end 

[ 
    'secondary_images/foo_1.jpg', 
    'secondary_images/foo_11.jpg', 
    'secondary_images/foo_01.jpg', 
    'secondary_images/foo_30.jpg', 
    'secondary_images/foo_20.jpg' 
].map{ |s| 
    get_image_num(s) 
} 
# => ["1", "11", "01", "30", "20"] 

Wenn Sie sowohl den id Wert, und die Dateinummer erhalten müssen, würde ich so etwas wie:

def get_image_num(fname) 
    File.basename(fname, File.extname(fname)).split('_') 
end 

[ 
    'secondary_images/123_1.jpg', 
    'secondary_images/123_11.jpg', 
    'secondary_images/123_01.jpg', 
    'secondary_images/123_30.jpg', 
    'secondary_images/123_20.jpg' 
].map{ |s| 
    get_image_num(s) 
} 
# => [["123", "1"], ["123", "11"], ["123", "01"], ["123", "30"], ["123", "20"]] 
+0

Danke, ich habe den '.basename' bei der Arbeit früher angeschaut und dachte, dass es nützlich sein könnte für das, was ich versuchte. Ich werde das morgen auf der Arbeit ausprobieren. – skreebidedeep

Verwandte Themen