do tabli, która posiada kolumnę o nazwie “hash” muszę zapisać pewną wartość, niestety ActiveRecord, ma metodę o nazwie hash i wyrzuca błąd ActiveRecord::DangerousAttributeError “hash is defined by Active Record”. Tabela używana jest przez inną aplikację, a chcę tylko wpisać rekord. Można uczywiście zrobić do za pomocą czystego sqla, ale czy da się to jakoś ładniej zapisać?
Jest powód dla którego jest to ostrzeżenie. nadpis\nie metody hash spowoduje że struktura Hash zgłupieje zupełnie. bo uzywa metody #hash i #eql? do sprawdzania czy to ten sam obiekt.
Moja rada to zamiast walić głową scianę zmienić nazwę kolumny. Jeżeli się nie da (baza jest uzywana przez inną aplikację), to w modelu robisz
def my_hash()
read_attribute(:hash)
end
def my_hash=(value)
write_attribute(:hash, value)
end
po czym już normalnie: Model.create(:my_hash => 1)
oczywiście zmienić my_hash na coś sensownego typu user_hash albo authentication_hash
baza wykorzystywana jest przez aplikacje trzecią i zmiana nazwy kolumny kompletnie odpada
jesli to co napisałeś by działało to wywolanie Model.create (bez parametrów) też by działało, a wywołanie create bez parametrów nawet nie działa, chociaż sprawdzałem to o północy więc może ze zmęczenia coś przeoczyłem.
to jest baza mysql z vbulettina (tabela cpsession ma pole o nazwie hash), chce ta baze jak najmniej zmieniac, tzn tylko dodawac i usuwac pola i nic więcej, wszelakie modyfikacje tej bazy są w 99,999…% niewskazane.
Zdecydowałem się ostatecznie na rozwiązanie activemodel + raw sql zwłaszcza że tabela ma 3 kolumny (userid, hash, timeline). Z widokami jakoś nie mam doświadczenia a jak juz pisałem wyżej nie chce tykać za mocno tej bazy (zmieniać nazw, wprowadzać nowe table), bo to może w przyszłości dość mocno skomplikować upgrade te zewnętrznej aplikacji (zwłaszcza że na jej rozwój nie mam żadnego wpływu)
sql injection jest w sytuacji gdy przepuszczasz coś z widoku strony do modeli, a tutaj tego nie będzie, bo wszystko generowane jest na serwerze i jedyne zwracane.
Nie zagłębiając się w mniej i bardziej oczywiste zagrożenia, czysty sql to przede wszystkim dużo niepotrzebnej roboty którą można zrzucić np. na gema sequel (polecam).