2012-02-08 18 views
7

nie mając dużo szczęścia ostatnio z odpowiedziami w Stackoverflow (myślę, że jestem królem udzielania TUMBLEWEED), ale i tak tu idzie:Szyny aktualizacji tylko puste pola

Jak mogę aktualizować tylko pola, które są puste podczas korzystania z activeRecord? Mam ten kod:

master_info.update_attributes({:originalTitle => slave_info.originalTitle,                   
:starring => slave_info.starring, 
:theatrical => slave_info.theatrical } 

i chciałby coś takiego:

master_info.update_attributes({:originalTitle => slave_info.originalTitle, if !master_info.originalTitle.present?                   
:starring => slave_info.starring, if !master_info.starring.present? 
:theatrical => slave_info.theatrical if !master_info.theatrical.present? } 

mogę to zrobić jedną linię na raz, ale staram się unikać tego:

master_info.update_attributes(:originalTitle => slave_info.originalTitle) if !master_info.originalTitle.present? 

I przeczytaj coś w stylu:

master_info.update_attributes({:originalTitle => slave_info.originalTitle,                   
          :starring => slave_info.starring, 
          :theatrical => slave_info.theatrical }.reject{ |key, value| value.present?}) 

Ale to nie działa, nie aktualizuje niczego, nawet pustych pól.

W rzeczywistości, idealnym rozwiązaniem byłoby nie powtarzanie nazw pól, ponieważ wszystkie one są takie same zarówno w systemie głównym, jak i podrzędnym, ale nie mogę wykonać .each na activeRecord. Ale to jest problem wtórny, podstawowym jest aktualizowanie pustych pól.

Oto nadzieję, ten nie otrzyma Tumbleweed :)

Odpowiedz

0

można zastąpić update_attributes w modelu coś takiego

def update_attributes(attributes) 
    attributes.each{|attr| attributes.delete(attr) unless read_attribute(attr).empty?} 
    super(attributes) 
end 

nie przetestowała ten kod może być następnie dostosowuje potrzebne.

+1

Jeśli chcesz zachować oryginalny sposób aktualizacji, powinieneś zdefiniować inną metodę zamiast przeciążania. – ksol

+0

Przykro mi, nie rozumiem. Chcę zaktualizować atrybuty, jeśli są one puste po stronie odbiorczej. Ten kod wygląda na to, że usuwa puste atrybuty z pola przychodzącego. Czy mogę to źle odczytać? – kakubei

+0

Przykro mi, zmieniłem na 'unless read_attribute (attr) .empty?'. –

7

Nieco później, ale pomyślałem, że dodam, jak to zrobiłem, na wypadek gdyby ktoś uznał to za użyteczne.

Użyłem funkcji w pierwszej odpowiedzi i zmodyfikowałem ją poniżej. Jak powiedział @ksol w swoim komentarzu, prawdopodobnie chcesz zachować oryginalną metodę update_attributes jaka jest, więc dodałem ją do mojego modelu. Jestem pewien, że można go włączyć na całym świecie, jeśli chcesz go dla wielu modeli.

def update_attributes_only_if_blank(attributes) 
    attributes.each { |k,v| attributes.delete(k) unless read_attribute(k).blank? } 
    update_attributes(attributes) 
end 

Usuwa wszelkie atrybuty z wartości mieszania, chyba że ma już wartość. Następnie aktualizuje pozostałe atrybuty jako normalne.

Powiązane problemy