2012-02-11 9 views
0

こんにちは、ありがとうございました。RoR:購入した製品とユーザーの関係を作成する

ご注文を保存する際に、ユーザーと製品(pdf)との関係を作成したいと考えています。 LINE_ITEMを購入したユーザの際

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 

、私は、ユーザーと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 

はIこれが十分明確であることを望みます。私はいつかこれを理解しようとしてきましたが、過去を初心者にしようと間違いなく努力しました。示唆的な読みは間違いなく歓迎です!

答えて

0

あなたは正しい考えがあるようです。

LineItemが多くPDF秒を持っているので、あなただけのデータベースからレコードを取得するために悩まずにLineItemからpdf_idを使用することができます。あたかも項目を配列にプッシュしているかのように、それらのIDを既存のuser-PDFアソシエーションのセットに追加することもできます。

あなたのモデルは現在のセッションにアクセスすることはできません(コントローラによって処理されるため)。メソッドの一部として、現在のユーザーをOrderに別の方法で渡す必要があります。

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 ...)を繰り返し、各line_item.pdf_idを見てpdfを見つけようとするときに問題が発生すると思います。これらのIDを取得すると、pdf関係を作成できます。全体として、私はline_item.pdf_idである各pdf.idを所持し、それをowned.idとして配置する必要があります。 – Jches

+0

まだエラーが発生していますか?私のサンプルコードを使用できましたか?そうでなければ、あなたの 'User'モデルはどのように見えますか? – Brandan

+0

いや私はまだエラーが発生しています。私は自分の質問を編集し、ユーザーモデルを追加しました。注文モデルのdef create_ownerのための私のコードは、リモートでも正しいですか? – Jches

関連する問題