Mam model z niektórymi atrybutami i atrybutem wirtualnym. Ten wirtualny atrybut służy do zaznaczenia pola wyboru w formularzu tworzenia.Wpisz rzutowany atrybut wirtualny modelu ActiveRecord
class Thing < ActiveRecord::Base
attr_accessor :foo
attr_accessible :foo
end
ponieważ pole to pole w formularzu, atrybut foo
otrzyma '0'
lub '1'
jako wartości. Chciałbym, że jest to logiczna z powodu następującego kodu:
class Thing < ActiveRecord::Base
attr_accessor :foo
attr_accessible :foo
before_validation :set_default_bar
private
def set_default_bar
self.bar = 'Hello' if foo
end
end
Problem polega na tym, że warunek będzie prawdziwa nawet gdy foo
jest '0'
. Chciałbym użyć ActiveRecord mechanizm typu odlewania ale tylko znalazłem to zrobić jest następujące:
class Thing < ActiveRecord::Base
attr_reader :foo
attr_accessible :foo
before_validation :set_default_bar
def foo=(value)
@foo = ActiveRecord::ConnectionAdapters::Column.value_to_boolean(value)
end
private
def set_default_bar
self.bar = 'Hello' if foo
end
end
Ale czuję się brudny robi to w ten sposób. Czy istnieje lepsza alternatywa bez ponownego zapisywania metody konwersji?
Dzięki
Ponieważ wartości można zmienić na "true" i "false", a one nadal powinny działać. Railsy to dobrze, ale w niewłaściwym miejscu IMHO. – Happynoff
O ustawieniu @bar w 'foo =' Myślę, że to nie jest miejsce, w którym można to zrobić, zasada jednej odpowiedzialności i wszystko. I, w moim prawdziwym przypadku użycia, ma sens umieszczenie go w before_validation;) – Happynoff
Masz rację. Masz takie rozwiązanie: https://gist.github.com/2000623, ale nie sądzę, że jest to lepsze rozwiązanie. To w zasadzie to samo, co szyny. Zobacz źródło: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/column.rb – Dougui