Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails:一对多和一对一_Ruby On Rails_Ruby On Rails 3_Activerecord_Ruby On Rails 3.2 - Fatal编程技术网

Ruby on rails RubyonRails:一对多和一对一

Ruby on rails RubyonRails:一对多和一对一,ruby-on-rails,ruby-on-rails-3,activerecord,ruby-on-rails-3.2,Ruby On Rails,Ruby On Rails 3,Activerecord,Ruby On Rails 3.2,我有模板和模板版本。一个模板可以有多个模板版本,但在任何给定时间只能有一个活动模板版本。我有以下两种型号: class Template < ActiveRecord:Base has_many :template_versions, :class_name => 'TemplateVersion' belongs_to :active_version, :class_name => 'TemplateVersion' end class TemplateVe

我有模板和模板版本。一个模板可以有多个模板版本,但在任何给定时间只能有一个活动模板版本。我有以下两种型号:

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
模板知道它的活动模板版本,但问题是模板版本不知道它属于哪个模板。我猜这是因为在插入到DB时,创建了template_版本以获取与模板关联的id,然后必须保存该id以返回模板id以填充模板版本


有没有办法做到这一切

对此不确定,但您可以尝试以下方法:

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
您不需要
保存

当前设置的问题是您为TemplateVersion定义了两种“模板”方法。如果我有一个tv对象,tv.template可能是has\u对象或属于\u模板,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
类模板'TemplateVersion'
有一个:活动版本,:类名称=>'TemplateVersion',:条件=>['active=?',true]
结束
类TemplateVersiontrue,:template\u id=>self.template\u id)。计数>0
结束
结束

然后,您可以将活动版本访问为t.active\u version,但要设置活动版本,您需要在TemplateVersion上进行更新。

您是否尝试过类似的操作,使用
:foreign\u key
?@Lucas-给定模型不需要与自身的关系。你是在建议另一种模式吗?
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