3

テンプレートとテンプレートバージョンがあります。テンプレートには多くのtemplate_versionsを含めることができますが、常にアクティブなtemplate_versionは1つだけです。私は次の2つのモデルを持っています:

class Template < ActiveRecord:Base
    has_many :template_versions, :class_name => 'TemplateVersion'
    belongs_to :active_version, :class_name => 'TemplateVersion'
end

class TemplateVersion < ActiveRecord:Base
    belongs_to :template
    has_one :template
end

テンプレートにはアクティブなtemplate_versionが1つしかないことが重要です。そのため、active_templateのキーはテンプレートモデルにあります。Railsコンソールでテストするまで、これはすべて問題ないようです。

t = Template.new()
tv = TemplateVersion.new()
t.active_version = tv
t.save

version = t.active_version //returns version
version.template_id //returns nil

テンプレートはアクティブなtemplate_versionを認識していますが、問題は、template_versionがどのテンプレートに属しているかを認識していないことです。これは、DBへの挿入時に、テンプレートを関連付けるIDを取得するためにtemplate_versionが作成され、テンプレートバージョンを設定するためにテンプレートIDを返すために保存する必要があるためだと思います。

これをすべて達成する方法はありますか?

4

2 に答える 2

1

現在の設定の問題は、TemplateVersionに2つの「テンプレート」メソッドを定義していることです。tvオブジェクトがある場合、tv.templateはhas_oneまたはbelongs_toテンプレートである可能性があり、ActiveRecordはどちらかを認識しません。どういうわけかそれらをエイリアスできるかどうかはわかりません。

回避策:TemplateVersionモデルに「アクティブ」列を追加し、アクティブなTemplateVersionが1つしかないことを検証します

class Template < ActiveRecord::Base
    has_many :template_versions, :class_name => 'TemplateVersion'
    has_one :active_version, :class_name => 'TemplateVersion', :conditions => ['active = ?', true]
end

class TemplateVersion < ActiveRecord::Base
    attr_accessible :template_id, :active
    belongs_to :template
    validates :only_one_active

    def only_one_active
      errors.add(:base, "Only one active version per template") if self.active == true and TemplateVersion.where(:active => true, :template_id => self.template_id).count > 0
    end

end

その後、アクティブバージョンにt.active_versionとしてアクセスできますが、アクティブバージョンを設定するには、TemplateVersionでその更新を行う必要があります。

于 2012-10-24T21:04:37.387 に答える
0

これについてはよくわかりませんが、次のことを試してみてください。

t = Template.new()
tv = TemplateVersion.new()
tv.save
t.active_version = tv
t.save

またはおそらく

t = Template.new()
tv = TemplateVersion.create()
t.active_version = tv
t.save

使用する場合は、使用createする必要はないと思いますsave

于 2012-10-24T00:45:46.483 に答える