Передать параметр для обратного вызова в Rails - PullRequest
0 голосов
/ 09 января 2019

У меня 2 модели: пользовательская и любимая. В модели Фаворит:

class Favorite < ApplicationRecord
  belongs_to :user, foreign_key: :user_id

  def self.add_favorite(options)
    create!(options)
  end

  def self.unfavorite(options)
    where(options).delete_all
  end
Теперь я хочу ограничить количество записей, сохраняемых в Избранном, равным 10. Это означает, что пользователям понравились только 10 товаров. Я исследовал Google, кто-то сказал, что я пытаюсь использовать обратный вызов, и я думаю, что это правильный путь, но это поднимает 2 вопроса: 1. Могу ли я использовать запрос в методе для обратного вызова? 2. Обратный звонок можно передать аргументом?

Это пример кода, я думаю:

class Favorite < ApplicationRecord
  after_create :limit_records(user_id)
  belongs_to :user, foreign_key: :user_id

  def self.add_favorite(options)
    create!(options)
  end

  def self.unfavorite(options)
    where(options).delete_all
  end

  def limit_records(user_id)
    count = self.where(user_id: user_id).count
    self.where(used_id: user_id).last.delete if count > 10
  end
Если у пользователя есть 10 избранных, когда им нравятся какие-либо продукты, обратный вызов будет вызван после создания избранного и будет удален, если это 11-я запись.

1 Ответ

0 голосов
/ 09 января 2019

У вас есть:

belongs_to :user, foreign_key: :user_id

в вашей Favorite модели и limit_records - это метод экземпляра для Favorite. Таким образом, у вас есть доступ к пользователю как self.user_id (или просто user_id, поскольку подразумевается self) внутри limit_records, и аргумент не требуется:

after_create :limit_records

def limit_records
  # same as what you have now, `user_id` will be `self.user_id`
  # now that there is no `user_id` argument...
  count = self.where(user_id: user_id).count
  self.where(used_id: user_id).last.delete if count > 10
end
...