0

まず、いくつかの背景。

私のアプリケーションモデルは次のようなものです:

  User has_many :subscriptions; has_many :courses, :through => :subscriptions
Subscription belongs_to :course, :user
  Course has_many :subscriptions; has_many :users, :through => :subscriptions

サブスクリプションは、状態 (:アクティブ、:非アクティブ、:失敗、:合格、:未払い) などの情報を格納するために使用される結合テーブルであり、コースの受講に伴うすべての情報 (グレードなど) へのコネクタとしても機能します。モデル (まだ追加されていません)、支払いモデル (進行中の作業) など)。

支払いモデルを追加して、サブスクリプションの支払い履歴を保存したいと考えています。各支払いは、1 つまたは複数のサブスクリプションに対して行うことができます。これまでのところ、私は を試しましたPayment has_many :subscriptions、コントローラーのロジックに問題があり、「サブスクリプションのユーザーからコースへの支払い」のモデルを関連付けるより良い方法があるのではないかと考えています。

技術的に言えば、支払いショー アクションでは、これらの各モデル (course.name、支払ったユーザーの user_id、payment.amount、これらはすべてサブスクリプションに関連付けられています) からの情報と、Payment.create アクションでの情報が必要です。サブスクリプションの状態を設定する必要があります (私ができることです)。

これがさまざまなモデルを関連付ける論理的/効率的な方法である場合、Payment show アクションで必要な情報 (各モデル コース、ユーザー、支払い、サブスクリプションからの情報) に最小限のデータベース呼び出しでアクセスするにはどうすればよいですか? 私は使用してRails 3.2/Ruby 1.9おり、単純な sql ステートメントの代わりに ActiveRecord/ARel を使用したいと考えています。「あなたは間違っている」という答えも受け入れます。アソシエーションを変更すると、コントローラーからテーブルへのアクセスがより効率的になる場合は、それも受け入れます。

4

2 に答える 2

1

@ D3mon-1stVFW の回答により、この問題を解決するための正しい軌道に乗ることができました。

Payment show アクションの場合、クエリは次のようになります。

@payment = Payment.find_by_id(params[:id])
@subscriptions = @payment.subscriptions.includes(:course, :user)

これにより、サブスクリプションに関連付けられたコースとユーザー データに次のようにアクセスできるようになります。

<% @subscriptions.each do |subscription|%>
  <%= subscription.payment.amount %>
  <%= subscription.user.email %>
  <%= subscription.course.name %>
  <%= subscription.state  %>
<% end%>

がまだ存在しない支払いの新規/作成アクションの場合payment.id、クエリは少し異なります。

@unpaid_subs = Subscription.where(:user_id => current_user.id).unpaid.includes(:course)
@payment = Payment.new

current_user支払う(新しい支払いを作成する)ユーザーはどこにあり、次のようなモデル.unpaidのスコープです。Subscription

scope :unpaid, -> { where('subscriptions.payment_id' => nil)}

ビューでは、show ビューと同じ方法でデータにアクセスできます。

<% @unpaid_subs.each do |sub| %>
  <%= sub.course.name %> | <%= sub.course.credits %><br />
<% end %>

私の混乱の主なポイントは、子から親の関連付けにアクセスできることを知らなかったということでした。サブスクリプションはコースに属していますが、まだ行うことができますsubscription.course.something

于 2012-10-30T17:52:09.037 に答える
1

する(でconfig/routes.rb

resources :users do
  resources :courses do
    resources :subscriptions
  end
end

これにより、次のことが可能になります@user.courses.subscriptions

coursesたとえば、 からに戻りたい場合はusers、ルートを次のように変更できます。

resources :users, :shallow => true do
 #...
end

編集:

支払いについては、あなたが言ったようにしますhas_many :subscriptions

支払いを表示するとき。あなたは次のようなことをします

payment_history = Payment.find(params[:id])
@subscriptions = payment_history.subscriptions

これで、その支払い履歴へのリンクのサブスクリプションのリストができました。たとえば、

ビューをループして、各サブスクリプションを表示します

<% @subscriptions.each do |subscription|%>
  <%= subscription.payment.id %>
  <%= subscription.users.size %>
  <%= subscription.courses.size %>
  <%= subscription.paying_user.name  %> <!-- or whereever it exists-->
<% end%>

そのためのルートがあることを確認し、ルートを変更した後にサーバーを再起動する必要があります

resources :payments, :shallow => true do
   resources :subscriptions
end
于 2012-10-18T19:15:39.587 に答える