gpt4 book ai didi

ruby-on-rails - Mongoid 命名空间模型和继承

转载 作者:可可西里 更新时间:2023-11-01 10:07:37 24 4
gpt4 key购买 nike

我正在尝试将命名空间模型与 Mongoid 一起使用,但似乎无法正常工作。

我有以下模型:Achievement、Flag、FlagCaptured

Achievment 是 Fl​​agCaptured 的基类。

应用程序/模型/achievement.rb

class Achievement
include Mongoid::Document
include Mongoid::Timestamps::Created

belongs_to :team
end

应用程序/模型/flag.rb

class Flag
include Mongoid::Document

field :name, :type => String
field :key, :type => String, :default => SecureRandom.base64
field :score, :type => Integer

belongs_to :achievement, :class_name => "Achievements::FlagCaptured"

validates :name, :presence => true, :uniqueness => true
validates :key, :presence => true, :uniqueness => true
validates :score, :presence => true, :numericality => { :only_integer => true }

def captured?
!achievement_id.nil?
end
end

app/models/achievements/flag_captured.rb

module Achievements
class FlagCaptured < Achievement
has_one :flag, :foreign_key => :achievement_id, :autosave => true

def score
self.flag.score
end
end
end

我在控制台中创建了 FlagCaptured 成就,如下所示:

Achievements::FlagCaptured.create(:flag => Flag.first, :team => Team.first)

现在将创建成就,我可以通过以下方式获得它:

Achievements::FlagCaptured.first

但是,关系的两边都没有设置。

所以

Achievements::FlagCaptured.first.flag

为零

Achievements::FlagCaptured.first.flag_id

给出一个 NoMethodError。

更进一步:

Flag.first.achievement

Flag.first.achievement_id

为零。

这是怎么回事?我已经尝试了我能想到的一切(设置外键、指定类名、指定逆关系),但没有任何效果。 :(

最佳答案

原来我需要添加

:autosave => true

到 FlagCaptured 模型中的关系并定义正确的外键现在一切正常。

关于ruby-on-rails - Mongoid 命名空间模型和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7559110/

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