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
[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
może zrobimy konkurs RubyMaliny czyli najdziwnejsze rozwiązania
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.
- Musi być stosunkowo krótki (nie więcej niż 100 LoC)
a nie jest ? - 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 - 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 - Musi być brzydki!
a jest ładny ? - 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 - 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
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?
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
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.