Mam 3 pola w mojej formie, których nie ma w mojej bazie danych: opening_type, opening_hours, opening_minutes. Chcę zaktualizować główny atrybut "otwarcie" (w bazie danych) tymi 3 polami.Szyny - Dodaj atrybuty nie w modelu i atrybut modelu aktualizacji
Próbowałem wielu rzeczy, które nie działają.
Właściwie mam:
attr_accessor :opening_type, :opening_hours, :opening_minutes
def opening_type=(opening_type)
end
def opening_type
opening_type = opening.split("-")[0] if !opening.blank?
end
def opening_hours=(opening_hours)
end
def opening_hours
opening_hours = opening.split("-")[1] if !opening.blank?
end
def opening_minutes=(opening_minutes)
end
def opening_minutes
opening_minutes = opening.split("-")[2] if !opening.blank?
end
Próbowałem dodając coś takiego:
def opening=(opening)
logger.info "WRITE"
if !opening_type.blank? and !opening_hours.blank? and opening_minutes.blank?
opening = ""
opening << opening_type if !opening_type.blank?
opening << "-"
opening << opening_hours if !opening_hours.blank?
opening << "-"
opening << opening_minutes if !opening_minutes.blank?
end
write_attribute(:opening, opening)
end
def opening
read_attribute(:opening)
end
Ale metody dostępowe nie są nazywane i myślę opening_type, opening_hours, opening_minutes były puste zbyt jeśli dostępowych zostały nazwane ...
Myślę, że nie potrzebuję oddzwaniania before_save i powinienem to przepisać akcesorów.
Uwagi: - Rails 3.0.5, - opening_type,:,: opening_minutes opening_hours mogłyby być pusty
EDIT: I uaktualniony mój kod
Uwaga ta odpowiedź zakłada, że chcesz tylko przechowywać połączone pole 'opening' w bazie danych. Innym podejściem byłoby przechowywanie poszczególnych komponentów w bazie danych i dynamiczne budowanie połączonego ciągu na żądanie. W zależności od Twoich wymagań, które mogą być dla Ciebie lepszym rozwiązaniem. – Gareth
Otrzymuję tę bazę danych z polem otwierającym. Ta baza danych jest synchronizowana z aplikacją na smartfona i nie mogę zmienić jej struktury, aby przechowywać 3 różne pola. ;-) Problem z wywołaniem zwrotnym before_validation polega na tym, że nie zajmujesz się przypadkiem, kiedy mamy zamiar edytować formularz ... i gdzie muszę uciąć pole otwierające w 3 vars ... dla formularza. Wiem, że mogę to zrobić ręcznie, ale pomyślałem, że było lepsze podejście do tego, aby to zrobić z akcesoriami ... –
Wszystko prawda, ale twoja sugestia pominięcia 'otwarcia =' złamie wiele rzeczy. Poza tym, bardzo pomysłowym pomysłem jest posiadanie metody ustawiającej, która całkowicie odrzuca parametr, który jest przekazywany. Lepiej mieć oddzielną metodę (jak moje 'set_opening'), która wyjaśnia, co robi. Nie musisz * mieć * używać before_validation, aby wywołać tę metodę, ale naprawdę polecam, że jest to osobna metoda. – Gareth