RoR: создание отношений между купленным продуктом и пользователем - PullRequest
1 голос
/ 11 февраля 2012

Здравствуйте и спасибо за любую помощь заранее.

Я хочу создать отношения между пользователем и продуктом (pdf) после сохранения заказа.

class PDF
  has_many :line_items
end

class LineItem
  belongs_to :pdf
  belongs_to :cart
end

class Cart
  has_many :line_items
  has_one :order
end

class Order
  belongs_to :cart
end

После покупки пользователем line_item я хотел бы создать отношения через модель соединения между пользователем и pdf (pdf_relationships).

Я пытаюсь найти каждый PDF (найденный foreign_key line_item.pdf_id) в данной корзине и создать pdf_relationships между пользователем и каждым PDF в корзине.Я сделаю идентификатор пользователя идентификатором владельца, а идентификатор pdf - владельцем_

Мой контроллер заказов выглядит следующим образом:

def create 
  @order = current_cart.build_order(params[:order])
  @order.ip_address = request.remote_ip
  if @order.save
    if @order.purchase
      render :action => "success"
    else
      render :action => "failure"
    end
  else
    render :action => 'new'
  end
end

это:

class Order
  belongs_to :cart

  before_save :create_owner

  ***def create_owner
    self.cart.line_items.each do |item|
      pdf.find_by_item_pdf_id(:pdf_id)
      current_user.pdf_relationships.build(:owned_id => pdf.id)
    end
  end***
end

вот моя модель пользователя:

   class User
  has_many :line_items

  has_many :pdf_relationships, foreign_key: :owner_id, :dependent => :destroy
  has_many :pdfs, foreign_key: :user_id, dependent: :destroy
  has_many :pdf_ownings, :through => :pdf_relationships, :source => :owned

 def owning?(owned)
    pdf_relationships.find_by_pdf_owned_id(owned)
  end

  def own!(owned)
    pdf_relationships.create!(:owned_id => owned.id)
  end

  def unown!(owned)
    pdf_relationships.find_by_pdf_owned_id(owned).destroy
  end

Надеюсь, это достаточно ясно.Я пытался понять это в течение некоторого времени и определенно пытался пройти мимо, будучи только новичком.Обнадеживающие чтения также приветствуются!

1 Ответ

0 голосов
/ 11 февраля 2012

Похоже, у вас правильная идея.

Поскольку 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...