将参数传递到Rails中的回调

时间:2019-01-09 02:29:55

标签: ruby-on-rails rails-activerecord

我有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种产品。我研究了谷歌,有人说我尝试使用回调,我认为这是正确的方法,但是它提出了两个问题: 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 :(得分:0)

您有:

belongs_to :user, foreign_key: :user_id
在您的Favorite模型中

并且limit_recordsFavorite上的实例方法。因此,您可以在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