RoR:在购买的产品和用户之间建立关系

时间:2012-02-11 03:15:20

标签: ruby-on-rails ruby-on-rails-3 activerecord

您好,感谢您提前提供任何帮助。

我想在保存订单时在用户和产品(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之间创建pdf_relationships。我将把用户的id作为所有者ID,并将pdf的id设为own_id。

我的订单控制器如下所示:

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 :(得分:0)

看起来你有正确的想法。

由于LineItem有很多PDF,因此您只需使用pdf_id中的LineItem,而无需从数据库中获取记录。您还可以将这些ID附加到现有的用户 - 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

您还必须声明UserPDF之间的关联并创建迁移,但听起来您已经计划这样做了。


更新:我认为您可以利用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。它隐含在用户中 - &gt;订单 - &gt;订单项 - &gt; PDF关系。

这可能无法解决您的问题。如果不删除原始订单项,您将无法“取消”PDF,这可能不是您想要的。但我认为你应该尝试瞄准这样的事情。尽可能多地利用Rails的内置关联。