Automatyczne generowanie metody w modelu

Problem rozwiązany, proszę o usunięcie posta :wink:
Chciałem napisać metodę która automatycznie generuje mi getter. Przykładowy getter:

def nip
  read_attribute(:field).to_i
end

Chciałbym do niego stworzyć coś takiego, co tworzyłoby taki getter automatycznie, ponieważ mam kilka takich pól, na których robiłbym dokładnie to samo. Fajnie jakby taka metoda była widoczna jak zwykła metoda modelu? Wie ktoś jak mógłbym coś takiego zrobić? :wink:

To może przedstaw nam co wyprodukowałeś :wink:

Moduł

module GettersAndSettersToI
  extend ActiveSupport::Concern
    module ClassMethods
    def getter_and_setter *methods
      methods.each do |method|
        #getter
        define_method(method) do
          read_attribute(method.to_sym).to_i
        end
        #setter
        define_method "#{method}=" do |arg|
          write_attribute(method.to_sym, arg.to_i) 
        end
      end
    end
  end
end

Przykładowe użycie

class Person
  include GettersAndSettersToI
  getter_and_setter "nip", "pesel"
end

Nip i pesel trzymam w bazie danych jako float i chciałem, aby model jakoś wymuszał, żeby zarówno z jak i do bazy danych wychodziły tylko dane typu integer :wink:

Nie wiem czy dobrze rozumie, ale czy nie wystarczyło by użycie attr_accessor?

Co?

1 Like

Pawcio jak chciałbyś to zrobić za pomocą attr_accessor? :grinning:
sneer masz lepszy sposób na przechowywanie liczb 10 i 11 cyfrowych? :blush:

Nip i pesel najlepiej przechowywać jako string. To są identyfikatory będące ciągami znaków (cyfr), a nie liczby. Nie wykonuje się na nich typowych operacji matematycznych jak np. dodawanie czy mnożenie dwóch numerów nip. Podobnie jest z numerami telefonów.

1 Like

No to chyba jednak źle zrozumiałem :slight_smile: ale w takim razie jeśli zmienisz typ kolumny z float na string jak napisał @mgn to żadne dodatkowe metody nie będą Ci potrzebne.