Актуализирайте стойността с first_or_create в rails

Имам таблица „Харесвания“ с колони business_id, user_id и liked(0,1) и функция „change_like_status“.

Сега при всяко извикване на функция, ако стойността е 1, тогава я настройте на 0 (или обратно) и ако записът не съществува, тогава създайте такъв със стойност 1.

Методът first_or_create работи добре, но как мога да превключвам стойността на колона „харесвано“, докато използвам този метод?

Ето моята функция:

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

person manoj    schedule 31.08.2015    source източник


Отговори (2)


Във вашия контролер направете промените

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

край

Във вашия модел like.rb файл добавете метод

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
person Amit Badheka    schedule 31.08.2015
comment
вместо update_attributes можете да използвате update_column, който няма да извика обратните извиквания и просто пише в DB - person Tim Kretschmer; 31.08.2015
comment
@huanson, променя се в зависимост от изискванията, независимо дали искам обратните извиквания да работят или не - person Amit Badheka; 31.08.2015

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

другият подход трябва да е нещо подобно

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!
person Tim Kretschmer    schedule 31.08.2015
comment
Дава ми грешка: недефиниран метод `find_by' за 1:Fixnum - person manoj; 31.08.2015
comment
каква е връзката между харесванията? какво връща current_user.likes? трябва да е AR колекция, ако има_много харесвания? - person Tim Kretschmer; 31.08.2015