Usuwanie dużej ilości rekordów :) POPRAWNY DESTROY?

DO usunięcia konkretne współrzędne geograficzne należące do danej nazwy pliku i przypisane do danego User’ra

CONTROLLER:

def destroy if Location.delete_all("user_id = #{@user.id} AND name ='#{params[:id]}'" ) flash[:notice] = "Poprawnie usunieto plik: #{params[:id]}" else flash[:alert] = "Blad usuwania pliku #{params[:id]}" end redirect_to profile_user_index_path(:id => @user.id) end
czy może tak lepiej

CONTROLLER:

[code]
def destroy
@location = Location.new

if @location.delete_locations(@user.id, params[:id] )
  flash[:notice] = "Poprawnie usunieto plik: #{params[:id]}"
else
  flash[:alert] = "Blad usuwania pliku #{params[:id]}"
end
redirect_to profile_user_index_path(:id => @user.id)

end[/code]
MODEL:

#usuwanie pliku gpx dla danego użytkownika def delete_locations(id,name) Location.delete_all(["user_id = ? AND name = ?",id,"#{name}"]) end
W sumie 2 opcja ładniejsza :wink: Ale zapytam.

Myślę, że oba fragmenty wymagają poprawek, proponuję zgłębić trochę lepiej podstawy oop :wink:

Jeżeli w metodzie obiektu, nie odwołujesz się do tego obiektu, to powinna to być metoda klasowa. Druga sprawa, jeśli location ma user_id, to czemu nie masz “User has_many :locations”.

[code=ruby]# model User

class User
has_many :locations
end

controller

if @user.locations.with_name(params[:id]).delete_all

(…)

model Location

class Location
def self.with_name(value)
where(name: value)
end
end[/code]
EDIT:
Inna sprawa, że tak się zastanawiam, czy ten if jest tam na miejscu. To nie jest tak, że metoda zwróci liczbę usuniętych rekordów? 0 ma też wartość true, a jeśli sypnie wyjątkiem, to if tutaj na nic.

[quote=sarniak]Myślę, że oba fragmenty wymagają poprawek, proponuję zgłębić trochę lepiej podstawy oop :wink:

Jeżeli w metodzie obiektu, nie odwołujesz się do tego obiektu, to powinna to być metoda klasowa. Druga sprawa, jeśli location ma user_id, to czemu nie masz “User has_many :locations”.

[code=ruby]# model User

class User
has_many :locations
end[/code]
[/quote]
W zasadzie źle zadałem pytanie bo chodziło mi o styl czy jest to po “rubio’wemu” napisane. Więc nie dodawałem całych Class, bo one tam działają mi mają co mają mieć żeby relacje działały :slight_smile:

Ale dzięki :slight_smile: (za mało kodu wklepałem w rubim :slight_smile: ) zapomniało się o łączeniu metod w rubim :slight_smile:

Myślę, że nie do końca zrozumiałeś o co mi głównie chodziło. Abstrahując od tego, że ładniej jest to zrobić na relacji (wtedy nie przekazujesz do delete_all conditions a i tak zapytanie sql wygląda tak samo), największym problemem było to:

@location = Location.new @location.delete_locations(...)
Chodzi o to, że to nie jest ani w stylu ruby’ego ani żadnego języka OO, bo nie powinieneś wołać metody, która powinna być klasowa na rzecz obiektu. To czy zamknąć to w metodę, czy nie to już inna sprawa.

I to poprawiłem.
DZIĘKI :smiley: