我有两个类,Tutor
和Session
,它们共享多态关系中相同的子类Field
。如何从Rails中的多态的另一个对象创建子对象
当教师创建会话时,我希望将标题从教师自动复制到会话(即,新条目将被添加到“字段”表中)。例如,
t = Tutor
Session.fields.build_from_tutor(t.fields)
我刚刚编译build_from_tutor方法。有没有Rails/Ruby的方式来做到这一点?
谢谢。
我有两个类,Tutor
和Session
,它们共享多态关系中相同的子类Field
。如何从Rails中的多态的另一个对象创建子对象
当教师创建会话时,我希望将标题从教师自动复制到会话(即,新条目将被添加到“字段”表中)。例如,
t = Tutor
Session.fields.build_from_tutor(t.fields)
我刚刚编译build_from_tutor方法。有没有Rails/Ruby的方式来做到这一点?
谢谢。
如果你想让两个类的子节点存在相同的条目,那就不是多态的;这只是混淆的继承。无论是Tutor has_many :sessions
和Session has_many :fields
,因而Tutor has_many :fields, :through => :sessions
,或者作为选择,Tutor has_many Sessions, :as => :fieldable
,一个Session has_many :fields, :as :feildable
和Field belongs_to :fieldable, :polymorphic => true
,但会妨碍导师和会话不断共享的字段。
所以你需要弄清楚。然后你可以找出一个理智的建筑师。但是你有它的方式,你永远无法正常化你的数据模型。即使对于一个Rails应用程序,你应该把自己作为一个最低标准,即3HO。
谢谢杰森。不,我不希望两个班的同学入学。对于Tutor中的每个主题,都有一条记录。对于Session中的每个主题,都有另一个记录。主题与Tutor AND Session具有多态关系。 – AdamNYC 2012-01-14 07:29:06
也许我对这个问题的表述感到困惑;如果Fields是真正的多态,并且你只希望从'Tutor'复制到'Session'的'title'属性,你可以使用回调函数,也就是说,如果'Tutor'应该与'Session'同时创建,那么:班导师; after_save:make_session; def make_session; self.topic.build_session(:title => self.title); end; end'这种方法的问题在于你违反了3NF和DRY原则;你正在复制数据库中的信息。如果你需要'title'存在两条记录中,你应该修改你的数据库模式。 – 2012-01-14 07:53:45