Как передать себя от модели до объекта обслуживания - PullRequest
0 голосов
/ 01 июля 2019

Я хотел переместить def track_item_added из модели в сервисный объект. Модель:

class Order < ApplicationRecord
  has_many :order_items
  has_many :items, through: :order_items, after_add: :track_item_added

  private

  def track_item_added
   aft = AutoFillTotal.new(self)
   aft.multiply_cost_and_quantity
  end
end

и мой сервисный объект

class AutoFillTotal
  def initialize(order)
   @order = order
  end

  def multiply_cost_and_quantity
   @order.items.pluck(:cost).zip(@order.order_items.pluck(:quantity)).
   map{|x, y| x * y}.sum
  end
end

что сейчас в объекте сервиса было в def track_item_added но теперь, когда я запускаю эту функцию, я получаю сообщение об ошибке

Traceback (most recent call last):
    2: from (irb):2
    1: from app/models/order.rb:7:in `track_item_added'
ArgumentError (wrong number of arguments (given 1, expected 0))

Может быть, проблема в том, что я передаю себя в конструктор (новый)

1 Ответ

2 голосов
/ 01 июля 2019

использовать только в обратном вызове ассоциации

has_many :items, through: :order_items, after_add: :track_item_added

after_add обратные вызовы ожидают один параметр.

https://guides.rubyonrails.org/v5.1/association_basics.html#association-callbacks

Rails передает объект, добавляемый или удаляемый, в обратный вызов.

...