开发者

Creating associations by using checkboxes

A User can only have two types of Subscriptions: DailySubscription and WeeklySubscription. When the user is at the new and edit action, I'd like them to check off either of the subscriptions they would like to get.

I'm comfortable using nested fields (as per Ryan Bates' screencast here) but I think when I add inheritance, it really complic开发者_如何转开发ating matters. Is there a better way?

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

My initial efforts with the controller are wacky:

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

I think I am conceptually really missing something here but I can't figure it out. Help!


Judging from your description, your user has only two possible subscription choices: daily and/or weekly. Therefore you dont need to have a has_many association because two has_ones would suffice(note polymorphic subscribeable below:

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

furthermore for the controller you just need to initialize User. Upon initialization, @user.daily_subscription and weekly_subscription will be null as determined by .blank? method. When you go ahead and create the user in the create method, you will need to populate these fields with instances of corresponding subscriptions.

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

 end

...

end

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜