Znalezione

def match_user @subdomain_users = online_store.subdomain.users if !match_email if !match_name_and_last_name if !match_last_name self.status = "not_matched" self.save! end end end end

Odpowiedź to: 42

Nie ma to jak dokładnie sprawdzić. Przezorny zawsze ubezpieczony.

a to wam wrzucę trochę więcej tego co wygrzebałem :smiley:

[code] def match_user
@subdomain_users = online_store.subdomain.users
if !match_email
if !match_name_and_last_name
if !match_last_name
self.status = “not_matched”
self.save!
end
end
end
end

def match_email
user = @subdomain_users.find_by_email(email)
if user.present?
self.user_id = user.id
self.status = “matched_email”
self.save!
end
end

def match_name_and_last_name
user = @subdomain_users.where(“first_name LIKE ? AND last_name LIKE ?”, “%#{self.first_name}%”, “%#{self.last_name}%”).first
if user.present?
self.user_id = user.id
self.status = “matched_name_and_last_name”
self.save!
end
end

def match_last_name
user = @subdomain_users.where(“last_name LIKE ?”, “%#{self.last_name}%”).first
if user.present?
self.user_id = user.id
self.status = “matched_last_name”
self.save!
end
end[/code]

drogus mam takich malin jeszcze troche :smiley:

może zrobimy konkurs RubyMaliny czyli najdziwnejsze rozwiązania :smiley:

proszę nie. zostawiłem okulary przeciwsłoneczne w domu

sorry @czACha, może nie zrozumiałeś mojego pierwszego posta: czemu ma służyć ten wątek? Chcesz wyszukiwać nagłupsze/najgorsze kawałki kodu? Niestety, nie omieszkałeś tego zaznaczyć (choćby w jednym zdaniu) w pierwszym poście, i ciągniesz to dalej. Szukanie najgorszych kawałków (bez próby poprawienia tego kodu) jest bez sensu (i nie temu oryginalnie miał służyć zakład patologii kodu…) – temat do wywalenia moim zdaniem.

  1. Musi być stosunkowo krótki (nie więcej niż 100 LoC)
    a nie jest ?
  2. Osoba publikująca kod musi mieć do niego prawo (uwaga na podsyłanie fragmentów z firm w których pracujecie do których tak naprawdę nie macie prawa)
    tak mam do niego prawo
  3. Musi działać (tzn. usuwane będą fragmenty gdzie osoba pytająca nie wie jak coś zrobić i podsyła kod jedynie w celu uzyskania działającego kodu). Od tego są działy “Zielona szkoła” oraz “Potrzebna pomoc”
    tak działa
  4. Musi być brzydki!
    a jest ładny ?
  5. Jeśli kod jest tak okropnie brzydki/zagmatwany, że nie można wywnioskować co robi patrząc na niego konieczne jest dodanie komentarza wyjaśniającego.
    nie potrzeba wszystko wiadomo
  6. Fragmenty kodu prosimy poprzedzic tagiem code=ruby
    poprawię

Skoro już bawimy się w selektywne cytowanie, to:

ani nie poprawiłeś kodu, ani nie poprosiłeś innych o to, żeby to zrobili – ba, nawet nie wygląda, jakbyś tego oczekiwał. Zgaduję, że jest to coś w stylu: „Patrzcie jaki brzydki kawałek kodu znalazłem”, co jest totalnym bezsensem. Dla mnie EOT.

Proszę o poprawienie tego kodu, bo nic nie przychodzi mi do głowy żeby go zrefaktoryzować a nie mogę na niego patrzeć, z góry dziękuję bardzo, również za przytoczenie regulaminu :slight_smile:

Wypaliło mi oczy. Oto co dostarczają ludzie którzy uważają że matematyka (w tym konkretnym przypadku: rachunek zdań) jest niepotrzebna w programowaniu.

OT: To są tacy? :open_mouth:

Całe pęczki.

Ja nigdy nie rozumiałem po co mi analiza w programowaniu (dalej średnio rozumiem, mimo, że zaliczyłem całkiem nieźle :P), ale jak ktoś mi powie, że nie jest mu potrzebna na przykład matma dyskretna to go wyśmieje :). Miałem w programie dyskretnej dużo rekursji, dużo rzeczy typu niezmienniki pętli itp. i to naprawdę jest fajne dla programisty.

a pomysłów brak :wink:

Hej, moja propozycja

[code=ruby]def match_user
result = catch(:matched) do
match_email
match_first_name_and_last_name
match_last_name
{status: “not matched”, user: nil}
end

self.user = result[:user]
self.status = result[:status]
self.save!
end

private

def subdomain_users
online_store.subdomain.users
end

def match_email
user = subdomain_users.find_by_email(email) and
throw :matched, {status: “matched_email”, user: user}
end

def match_first_name_and_last_name
user = subdomain_users.where(“first_name LIKE ? AND last_name LIKE ?”,
“%#{first_name}%”, “%#{last_name}%”).first and
throw :matched, {status: “matched_first_name_and_last_name”, user: user}
end

def match_last_name
user = subdomain_users.where(“last_name LIKE ?”, “%#{last_name}%”).first and
throw :matched, {status: “matched_last_name”, user: user}
end[/code]
Oczywiście możnaby klasycznie pójść i zapisać metodę match_user przy użyciu ||:

[code=ruby]def match_user
result = begin
match_email ||
match_first_name_and_last_name ||
match_last_name ||
{status: “not matched”, user: nil}
end

self.user = result[:user]
self.status = result[:status]
self.save!
end[/code]
jedna z podmetod mogłaby wyglądać tak:

def match_email user = subdomain_users.find_by_email(email) && {status: "matched_email", user: user} end
EDIT: Hm, jak na to teraz patrzę, to operatory logiczne są w tym wypadku good enough. Ale i tak: co myślicie o takim zastosowaniu throw?

Przypuszczam, że jest znacznie mniej wydajny (podobnie jak raise) niż instrukcja warunkowa.

No właśnie też myślałem, że jest, ale nie jest aż tak drastycznie:

[code]require ‘benchmark’

def raise_test_success
begin
5
rescue
10
end
end

def raise_test_failure
begin
raise(“not_completed”)
rescue
10
end
end

def throw_test_success
catch(:done) do
throw(:done, 5)
end
end

def throw_test_failure
catch(:done) do
10
end
end

def if_test_success
if true
5
else
10
end
end

def if_test_failure
if false
5
else
10
end
end

n = 2_000_000
Benchmark.bm do |x|
x.report(‘raise-success’) { n.times { raise_test_success } }
x.report(‘raise-failure’) { n.times { raise_test_failure } }
x.report(‘throw-success’) { n.times { throw_test_success } }
x.report(‘throw-failure’) { n.times { throw_test_failure } }
x.report(‘if-success’) { n.times { if_test_success } }
x.report(‘if-failure’) { n.times { if_test_failure } }
end[/code]
Wyniki:

user system total real raise-success 0.150000 0.000000 0.150000 ( 0.156401) raise-failure 15.760000 0.690000 16.450000 ( 16.449980) throw-success 1.060000 0.380000 1.440000 ( 1.435820) throw-failure 0.430000 0.000000 0.430000 ( 0.435826) if-success 0.160000 0.000000 0.160000 ( 0.154372) if-failure 0.150000 0.000000 0.150000 ( 0.154553)
Ruby 1.9.3-p0

Być może dałoby się używać catch/throw w innych celach niż tylko wyjście z podwójnej pętli, aby zwiększyć czytelność kodu.

sevos : takie tam
http://m.onkey.org/ruby-i-don-t-like-2-catch-wtf-throw-wtf