gpt4 book ai didi

ruby-on-rails - ruby rails : One-to-Many with One-to-One

转载 作者:行者123 更新时间:2023-12-04 06:01:50 28 4
gpt4 key购买 nike

我有模板和模板版本。一个模板可以有多个 template_version,但在任何给定时间只有一个事件的 template_version。我有以下两个模型:

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

一个模板只有一个 active template_version 很关键,这就是为什么 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 不知道它属于哪个模板。我猜这是因为在插入数据库时​​,创建了 template_version 以获取与模板关联的 id,然后必须保存该 id 以交回模板 id 以填充模板版本。

有没有办法完成这一切?

最佳答案

您当前设置的问题是您为 TemplateVersion 定义了两个"template"方法。如果我有一个 tv 对象,tv.template 可能是 has_one 或 belongs_to 模板,ActiveRecord 不知道是哪个。我不确定您是否可以以某种方式为这些别名。

解决方法:向您的 TemplateVersion 模型添加一个“事件”列并验证只有一个事件的 TemplateVersion

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 上进行更新。

关于ruby-on-rails - ruby rails : One-to-Many with One-to-One,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13041279/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com