2015-08-31 12 views
5

Mam tabelę "Likes" z kolumnami business_id, user_id i liked (0,1) oraz funkcją "change_like_status".Zaktualizuj wartość za pomocą first_or_create in rails

Teraz na każdym wywołaniu funkcji, jeżeli wartość wynosi 1, a następnie ustawić go na 0 (lub odwrotnie), a jeśli nie istnieje rekord następnie utworzyć jedną z wartości 1.

Sposób first_or_create działa dobrze ale jak mogę zmienić wartość kolumny "polubiłem" podczas korzystania z tej metody?

Oto moja funkcja:

def change_like_status 
    if current_user.present? 
    status = Like.where("business_id = ? AND user_id = ?",params['id'],current_user.id).first_or_create(:business_id => params['id'],:user_id => current_user.id,:liked => '1') 
    abort status.inspect 
    else 
    return render :json => {:status => false,:msg=>"You need to sign in before performing this action."} 
    end 
end 

Odpowiedz

4

w was kontrolera, dokonać zmian

def change_like_status 
    if current_user 
    status = Like.create_or_change_status(params[:id], current_user.id) 
    else 
    return render json: { status: false, msg: "You need to sign in before performing this action." } 
    end 

koniec

W pliku modelu like.rb, dodać metodę

def self.create_or_change_status(business_id, user_id) 
    status = where(business_id: business_id, user_id: user_id).first 
    if status.nil? 
     status = create({business_id: business_id, user_id: user_id, liked: 1}) 
    else 
     status.update_attributes(liked: !status.liked) 
    end 
    status 
end 
+1

Jego działanie !!! Wielkie dzięki :) – manoj

+0

to naprawdę nieprzyjemny kod :-) –

+0

zamiast update_attributes możesz użyć update_column, która nie wywoła zwrotów i po prostu napisze do DB –

1
def change_like_status 
    if current_user 
    current_user.likes.find_by(business_id: params[:id]).switch_status! 
    else 
    return render json: { status: false, msg: "You need to sign in before performing this action." } 
    end 
end 

class Like 
    def switch_status! 
    self.update_column :liked, !liked 
    end 
end 

inne podejście powinno być coś takiego

class Like 
    def switch_status! 
    self.update_column :liked, !liked 
    end 
end 


class User 
    def likes id 
    likes_for_business id 
    end 

    def likes_for_business(id) 
    likes.find_by(business_id: id) || likes.create(:business_id: id, liked: true) 
    end 
end 

# controller 
current_user.likes(params[:id]).switch_status! 
+0

To daje mi błąd: Metoda niezdefiniowana 'find_by” na 1: Fixnum – manoj

+0

Siema relacja lubi? co zwraca current_user.likes? powinno być kolekcją AR, jeśli ma on_many lubi? –

+0

użytkownik has_many: polubił – manoj

Powiązane problemy