Похоже, у вас правильная идея.
Поскольку LineItem
имеет много PDF
с, вы можете просто использовать pdf_id
из LineItem
, не потрудившись извлечь запись избаза данных.Вы также можете добавить эти идентификаторы к существующему набору ассоциаций пользователь-PDF, как если бы вы просто помещали элементы в массив.
Однако ваша модель не будет иметь доступа к текущему сеансу (так как он обрабатываетсяконтроллер), поэтому вам придется передать текущего пользователя в Order
другим способом, возможно, как часть метода purchase
.
class Order
belongs_to :cart
def purchase(user)
# ... existing logic ...
user.pdf_relationship_ids << cart.line_items.map(&:pdf_id)
end
end
Вам также придется объявить ассоциациюмежду User
и PDF
и создать миграции, но, похоже, вы уже планируете это сделать.
Обновление: Я думаю, вы можете значительно упроститьUser
модель с использованием has_many :through
.Вот что я предполагаю:
class User < ActiveRecord::Base
has_many :orders
has_many :line_items, :through => :orders
has_many :pdfs, :through => :line_items
end
class Order < ActiveRecord::Base
belongs_to :user
has_many :line_items
end
class LineItem < ActiveRecord::Base
belongs_to :order
has_one :pdf
end
class Pdf < ActiveRecord::Base
belongs_to :line_item
end
Тогда вам не нужно явно указывать, что пользователь владеет PDF.Это подразумевается в отношении пользователя -> order -> line -> PDF.
Это может не решить вашу проблему как есть.Вы не сможете «отказаться» от PDF, не удалив исходную позицию, что, вероятно, не то, что вам нужно.Но я думаю, что вы должны стремиться к чему-то подобному.Используйте как можно больше встроенных ассоциаций Rails.