2011-01-28 20 views
2

ユーザーには、DailySubscriptionとWeeklySubscriptionという2種類のサブスクリプションしかない場合があります。ユーザーが新しく編集操作を行っているときに、自分が購読したい購読のどちらかをチェックすることをお勧めします。チェックボックスを使用した関連付けの作成

(Ryan Batesのスクリーンキャストhere)ネストされたフィールドを使用するのは快適ですが、継承を追加すると実際に問題が複雑になると思います。 良い方法がありますか?コントローラと

class User < ActiveRecord::Base 
    has_many :subscriptions 
end 

class Subscription < ActiveRecord::Base 
    belongs_to :user 
    # type field is defined in the migration for Single Table Inheritance 
end 

class DailySubscription < Subscription 
    # Business logic here 
end 

class WeeklySubscription < Subscription 
    # Different business logic here 
end 

私の最初の努力が奇抜です:

class UsersController < ApplicationController 
    def new 
    @user = User.new 
    # I can't use @user. subscriptions.build as Rails doesn't 
    # know what type of model to add! 
    @user.subscriptions = [DailySubscription.new, WeeklySubscription.new] 
    end 

    ... 

end 

私は概念的には本当にここに何かが足りないと思うが、私はそれを把握することはできません。助けて!

+0

DailySubscriptionsとWeeklySubscriptionsは排他的ですか?ユーザーが同じタイプの複数のサブスクリプションを持つことはできますか?おそらくあなたが望むのは、ユーザーがhave_one DailySubscriptionとhave_one WeeklySubscriptionを持つことです。 –

+0

ユーザーがチェックボックスをチェックするよりも多くのことがない限り、新しいサブスクリプションを作成する代わりにローカル変数をビューに渡すことができます(空のままにします)。作成アクションでは、paramsハッシュからチェックボックスの値を読み取り、作成するサブスクリプションを決定することができます。 – weltraumpirat

+0

@ジミー。ユーザーは両方を持つことができます。ユーザーにはもっと多くの情報がある可能性があります。 – jevy

答えて

0

あなたの説明から判断すると、ユーザーには2つの可能なサブスクリプションの選択肢があります:毎日および/または毎週。したがって、あなたは2 has_onesは、下の多型subscribeableに注意してください(十分であるためにhas_manyの関連性を持っている必要がいけない:あなただけのユーザーを初期化する必要があり、コントローラのため、さらに

class User < ActiveRecord::Base 
    has_one :daily_subscription, :as => :subscribeable 
    has_one :weekly_subscription, :as => :subscribeable 
end 

class Subscription < ActiveRecord::Base 
    belongs_to :subscribeable, :polymorphic => true 
    # type field is defined in the migration for Single Table Inheritance 
end 

class DailySubscription < Subscription 
    # Business logic here 
end 

class WeeklySubscription < Subscription 
    # Different business logic here 
end 

初期化時に、user.daily_subscriptionとweekly_subscription @ nullになります.blank?方法によって決定される。あなたが先に行くとメソッドを作成してユーザーを作成するときは、対応するサブスクリプションのインスタンスでこれらのフィールドを移入する必要があります。

class UsersController < ApplicationController 
    def new 
    @user = User.new 
    # bam -- youre done. 

end 

...

end

+0

@ jevy。どのような質問ですか? P.S.あなたが元の質問を、データモデルの説明などが変更された場合、コメントに入れた情報で更新できますか? –

+0

これは私が探しているかもしれないと思います。ちょうど明確にするために、新しい(そして編集した)ビューでは、これらの値のチェックボックスを作成して自動的に入力します。作成(および更新)アクションでは、パラメータを直接チェックして、チェックボックスが選択されているかどうかを確認し、自動的には発音しないアソシエーションを適切に削除または作成する必要があります。 – jevy

+0

それは、毎日と毎週の定期購読がモデルに基づいて何を意味するかによって異なります。これらが基本的にフラグであれば、Userモデルでブール値として表現することもできます。この方法でチェックボックスはActiveRecordに直接変換されます。これは、2つのタイプの購読だけが存在する場合に機能します。 –

関連する問題