2012-02-11 74 views
0

您好,感谢您提前给予帮助。RoR:在购买的产品和用户之间建立关系

我想在保存订单时创建用户和产品(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为owned_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 

我希望这已经够清楚了。我一直试图弄清楚这个问题,现在肯定是想成为一名新手。暗示性的读物也绝对受欢迎!

回答

0

它看起来像你有正确的想法。

由于LineItem有很多PDF S,你可以使用来自LineItempdf_id没有费心去从数据库读取记录。您也可以将这些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之间的关联,并创建了迁移,但它听起来像你已经打算这样做。


更新:我想你可以通过服用has_many :through优势极大地简化您的User模型。这是我设想的:

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。它隐含在用户 - >订单 - >订单项 - > PDF关系中。

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

+0

我想我一定是在正确的方向前进。我想,当我尝试通过遍历购物车中的每个line_item(cart.line_item.pdf_id.each ...)来查找pdf并查看每个line_item.pdf_id时,问题就出现了。一旦我得到这些ID,那么我可以创建PDF关系。总的来说,我需要采取每个pdf.id这是line_item.pdf_id并将其作为owned.id。 – Jches 2012-02-11 03:55:08

+0

你还在收到错误?你能使用我的示例代码吗?如果不是,你的'User'模型是什么样的? – Brandan 2012-02-11 04:13:19

+0

是的,我仍然有错误。我编辑了我的问题并添加了用户模型。我的代码def create_owner在订单模型中甚至远程更正? – Jches 2012-02-11 20:56:12