2009-04-21 2 views
2

Мое понимание RoR, к сожалению, отсутствует. У меня есть три отношения «один-к-одному», которые я хочу поддерживать в одном представлении. У меня есть следующие модели:Основные вопросы Rails: отношения «один-к-одному»

class Ood< ActiveRecord::Base 
    has_one :female_trait 
    has_one :male_trait 
end 

class Female_Trait < ActiveRecord::Base 
    belongs_to :ood 
end 

class Male_Trait < ActiveRecord::Base 
    belongs_to :ood 
end 

Ood будет иметь либо запись в таблице Female_Trait или Male_Trait таблицы, но не оба. Мои усилия по настройке новых/создания изменений/обновлений в моем OodController не удалось. Вот пример моей ошибочной логики в OodController:

def new 
    @ood = Ood.new 
    @female_trait = Female_trait.new 
    @male_trait = Male_trait.new 
    ... 
end 

def create 
    @ood = Ood.new(params[:ood]) 
    if !params[:female_trait][:trait1].blank? and !params[:female_trait[:trait2].blank? 
    @female_trait = @ood.female_trait.build(params[:female_trait]) 
    if !params[:male_trait][:trait1].blank? and !params[:male_trait[:trait2].blank? 
    @male_trait = @ood.male_trait.build(params[:male_trait]) 
    ... 
end 

Какую концепцию мне не хватает?

+0

Имеют ли женские_трайт и male_trait аналогичные атрибуты? –

+0

Нет, я пытался сократить код примера и должен был использовать trait1 через trait4 вместо повторного использования trait1 и trait2 – littlebit

ответ

2

Почему бы не использовать полиморфные отношения, которые указывают либо на Женский_Перед, либо на Мужской_Перет?

class Ood< ActiveRecord::Base 
    belongs_to :trait, :polymorphic => true 
end 

class Female_Trait < ActiveRecord::Base 
    has_one :oods, :as => :trait 
end 

class Male_Trait < ActiveRecord::Base 
    has_one :oods, :as => :trait 
end 
+1

Как можно выразить это в процессе миграции? –

+0

да? может показать пример того, как создать объект Female_Trait, плохо проголосовать за то, что уши :) –

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