2015-08-31 20 views
5

Ho una tabella "Mi piace" con colonne business_id, user_id e piaciuto (0,1) e una funzione 'change_like_status'.Valore di aggiornamento con first_or_create in rail

Ora su ogni chiamata di funzione, se il valore è 1 quindi impostare a 0 (o viceversa) e non se record non esiste quindi creare uno con valore 1.

Procedimento first_or_create funziona bene ma come posso cambiare il valore della colonna "Mi piace" mentre utilizzo questo metodo?

Qui è la mia funzione:

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 

risposta

4

In te controllore, apportare le modifiche

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 

fine

Nel file modello di like.rb, aggiungere un metodo

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

funziona !!! Grazie mille :) – manoj

+0

questo è un codice veramente cattivo :-) –

+0

invece di update_attributes u puoi usare update_column che non chiamerà i callbacks e scrive solo in 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 

altro approccio dovrebbe essere qualcosa di simile

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

Mi dà errore: metodo non definito 'find_by' per 1: Fixnum – manoj

+0

che cosa è il rapporto di calibro? cosa restituisce current_user.likes? dovrebbe essere una collezione di AR se è piaciuta a qualcuno? Utente –

+0

has_many: likes – manoj

Problemi correlati