2011-01-28 3 views
2

Пользователь может иметь только два типа подписей: DailySubscription и WeeklySubscription. Когда пользователь находится в новом и редактируемом действии, я бы хотел, чтобы они отметили любую из подписей, которые они хотели бы получить.Создание ассоциаций с помощью флажков

Мне комфортно использовать вложенные поля (как показано на снимке Райана Бейтса 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

Являются ли ежедневные подписки и еженедельные подписки взаимоисключающими? Может ли пользователь иметь более одной подписки того же типа? Возможно, вы хотите, чтобы пользователь имел одну из DailySubscription и has_one WeeklySubscription. –

+0

Вы можете передать локальную переменную в представление вместо создания новых подписей (оставьте их пустыми), если только пользователю больше не нужно делать, чем устанавливать флажок. В действии create вы можете прочитать значение флажка из хэша params и решить, какая подписка должна быть создана. – weltraumpirat

+0

@Jimmy. Пользователь может иметь оба. Возможно, у пользователя может быть больше. – jevy

ответ

0

Судя по вашему описанию, у вашего пользователя есть только два возможных варианта подписки: ежедневно и/или еженедельно. Поэтому вам не нужно иметь has_many ассоциацию, потому что два has_ones хватило бы (обратите внимание на полиморфный subscribeable ниже:.

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 будет нулевым как определено .blank? метод. Когда вы идете вперед и создать пользователя в методе создания, вам нужно будет заполнять эти поля с экземплярами соответствующих подписок.

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

end 

...

конец

+0

@jevy. Какие вопросы? Постскриптум Не могли бы вы обновить исходный вопрос с информацией, которую вы добавили в комментарии, если она изменит описание модели данных и т. Д. –

+0

Я думаю, что это может быть то, что я ищу. Чтобы уточнить, в новых (и редактировании) представлениях я просто создаю флажки для этих значений, которые должны автоматически заполняться. В действии create (и update) я должен будет проверить параметры непосредственно, чтобы увидеть, были ли отмечены флажки, и удалить или создать ассоциацию соответствующим образом, что не звучит как автоматическое. – jevy

+0

Все зависит от того, что Daily vs Weekly подписка означает моделирование. Если они являются в основном флагами, то, возможно, представляют их в качестве логических элементов в модели User. этот флажок будет переводиться непосредственно в ваш ActiveRecord. Это работает, если есть только два типа подписки imho –

Смежные вопросы