czwartek, 25 września 2014

Sumowanie wartości w rekordach wybranego już zestawu z bazy danych

Rozważmy taki scenariusz: wybraliśmy wszystkich klientów, którzy w zadanym okresie kupili więcej niż jeden towar z naszego sklepu internetowego. Otrzymaliśmy zestaw klientów wraz z ilością zakupionych towarów i sumą cen tych towarów per klient.
A co jeśli chcemy zsumować ilość wszystkich towarów zakupionych przez klientów w tym zestawie?
Zawsze robiłem to tak:
  @customers.sum(&:amount)
No i fajnie. Działało. Działało do momentu, dopóki nie sumowałem ilości przepracowanych godzin, które to godziny było obliczane z dat. Z niewiadomych przyczyn generowana kolumna była w formacie string i sumowanie tworzyło wielki string.

Można to zrobić tak:
  @customers.sum{|customer| customer.amount.to_i}
Problem znika.

piątek, 19 września 2014

Wstawienie własnego parametru do ścieżki Paperclip'a

W którymś ze swoich projektów potrzebowałem aby obrazki gromadzone przez użytkowników aplikacji gromadzone były w katalogach firm, do których należą owi użytkownicy. Oczywiście w parametrze "path" Paperclip'a nie występuje nic podobnego do "firm_id".

Innymi słowy chciałem zapisać coś takiego:
has_attached_file :scan_picture, :styles => {:thumb => '50x50>'},
                  :default_url => '/images/:style/missing.png',
                  :url => "/system/scan_pictures/:firm_id/:id/:style/:basename.:extension",
                  :path => ":rails_root/public/system/scan_pictures/:firm_id/:id/:style/:basename.:extension"


Jest to jednak możliwe :-)
Zrobiłem tak:
w katalogu /config/initializers stworzyłem plik paperclip_interpolations.rb
w tym pliku umieściłem zapis:
Paperclip.interpolates('firm_id') do |attachment, style|
  attachment.instance.move_out.customer.firm_id.to_s.parameterize
end
Tłumaczyć to można tak:
Weź egzemplarz klasy, która wywołuje dołączanie pliku (attachment.instance), pobierz z niego obiekt wyjazd (move_out), a z niego klienta i firmę, do której klient należy. Przekształć firm_id na string i użyj metody prametrize.
No i aby powyższe lepiej zrozumieć można przytoczyć jeszcze specyfikację MoveOut (wyjazd):
class MoveOut < ActiveRecord::Base
  belongs_to :customer
end

wtorek, 18 lutego 2014

Kopiowanie plików w Javie

Ze względu na kompatybilność wsteczną robię to tak:
private static void copyFileUsingFileChannels(File source, File dest)
  throws IOException {
 FileChannel inputChannel = null;
 FileChannel outputChannel = null;
 try {
  inputChannel = new FileInputStream(source).getChannel();
  outputChannel = new FileOutputStream(dest).getChannel();
  outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
 } finally {
  inputChannel.close();
  outputChannel.close();
 }
}
Rzecz zaciągnięta ze strony http://examples.javacodegeeks.com/core-java/io/file/4-ways-to-copy-file-in-java/. Polecam ją przejrzeć, gdyż są na niej inne przykłady włącznie z najprostszym wykorzystującym rozwiązania z Java 7.

czwartek, 30 stycznia 2014

Dynamiczne dodanie pola do obiektu w Ruby

Czasami takie pole na jakiś czas okazuje się potrzebne.
Więc robię to tak:
@customer = Customer.find(1)
@customer.class.module_eval { attr_accessor :age}
@customer.age = 69 #już niemłody

wtorek, 10 grudnia 2013

Usunięcie plików katalogu tmp z repozytorium GIT

Niejednokrotnie pisałem tutaj o cieniach pracy z GIT'em. Kulawość (przepraszam za kolokwializm) tego systemu zwala z nóg. Niektórzy mówią "dno" i nie jestem do końca pewien, czy by im właśnie nie przyklasnąć. Ot chociażby kwestia pliku .gitignore.
W książkach (chociażby http://progit.org/book/pl/ albo http://helion.pl/ksiazki/git-rozproszony-system-kontroli-wersji-wlodzimierz-gajda,gitroz.htm) znajdziemy informacje jakoby umieszczenie nazwy pliku bądź katalogu w .gitignore spowoduje to, że GIT przestanie je śledzić. Czytasz to? To chyba już wiesz, że tak nie jest! Opisują to różni biedacy (jak nie przymierzając ja) borykający się z tym problemem na przykład tutaj http://stackoverflow.com/questions/6317169/using-gitignore-to-ignore-but-not-delete-files. Różne rady padają.

Mi pomaga to:

Jeśli zrobiłeś już
git add .
a potem commit i właśnie katalog tmp lub log znalazł się w repozytorium GIT'a? To teraz przenieś na bok całą zawartość danego katalogu. Zrób commit. W pliku .gitignore umieść dany katalog. Wrzuć z powrotem zawartość katalogu tmp lub log. Wyślij list do Linusa aby zobaczył jak to się robi w Bazaar. Nic nie wskórasz, ale będziesz miał spokój.

piątek, 7 czerwca 2013

VIM - poprawne formatowanie kodu html w plikach PHP

Podczas edycji kodu php te części, które pisze się w czystym html nie są poprawnie formatowane w vim'ie.
Jest na to rada, a właściwie łata:
:set ft=html
i już poprawnie formatuje się html (ale niepoprawnie php)
więc można powrócić:
:set ft=php

wtorek, 23 kwietnia 2013

Operator trójargumentowy w Javie

Przypomnienie składni:
zmienna = warunek ? wartosc_jak_prawda  : wartosc_jak_falsz;
na przykład:
String message = object.getMessage().equals("") ? "brak wiadomości" : object.getMessage();