gpt4 book ai didi

ruby - 使用嵌入文档时的 ActiveRecord 嵌套验证 : Mongoid

转载 作者:太空宇宙 更新时间:2023-11-03 16:47:47 24 4
gpt4 key购买 nike

我正在将类(class)列表文档嵌入到名为 curriculum 的父文档中。该类(class)列表属于示范类(class)。

类(class)列表模型:

     include Mongoid::Document
@schema = {
'type' => 'object',
'properties' => {
# 'id' => { 'type' => 'string' },
'course_order_id' => { 'type' => 'integer'}, #Explicit course ID order
'course_id' => { 'type' => 'string' }
}
}


@modelName = 'courselist'
@collectionName = 'courselist'

field :course_order_id, type: Integer
belongs_to :course #Course model

embedded_in :curricula, class_name:"Models::Persistence::Curriculum"

类(class).rb

     @schema = {
'type' => 'object',
'properties' => {
'id' => { 'type' => 'string' },
'title' => { 'type' => 'string' },
'description' => { 'type' => 'string' },
'cover_image_url' => { 'type' => 'string' },
'trailer_url' => { 'type' => 'string' },
'courselist' => {'type' => 'array'},
'price' => { 'type' => 'float' },
'currency_id' => { 'type' => 'string' },
'publisher_id' => { 'type' => 'string' },
'certification_ids' => { 'type' => 'array' },
'version' => { 'type' => 'integer' },
'status' => { 'type' => 'string'}
}
}
@modelName = 'curricula'
@collectionName = 'curricula'


store_in collection: 'curricula'

field :title, type: String
field :description, type: String

embeds_many :courselist

在类(class)路线上执行 GET 时我得到的 JSON:

           "id": "552bfae243534fcdd2a20000",
"courselist": [
{
"_id": {
"$oid": "552bfae243534fcdd2a30000"
},
"course_order_id": 1,
"course_id": {
"$oid": "552bfae143534fcdd2930000"
}
},
{
"_id": {
"$oid": "552bfae243534fcdd2a40000"
},
"course_order_id": 2,
"course_id": {
"$oid": "552bfae243534fcdd29f0000"
}
}
]
}

我的疑问:

  1. $oid 是什么意思?有没有办法将它覆盖到一个不涉及 $ 作为前缀的键?
  2. 如何验证类(class)列表中所有对象的 courseID?现在我已经写了这个但是它不起作用:(

    validate :validate_courselist

    def validate_courselist
    if (courselist == nil)
    return
    end
    if (courselist.uniq.length != courselist.length)
    errors.add :base, "Course ids should be unique"
    end
    courselist.each do |course_id|
    if (Models::Persistence::Course.find_by( _id: course_id) == nil) #this is my issue. How can I get the $oid of the course object??
    errors.add :base, "Course id #{course_id} could not be found"
    end
    end

    结束Edit1:以上验证是在嵌入式父模型中完成的。应该对 child 做吗?还是在 parent 那里?还是无所谓?提前致谢。

最佳答案

$oid 就是 BSON::ObjectId 将自身序列化为 JSON 的方式。你可以自己打开它,或者,如果你想在你的模型实例上继续使用 as_jsonto_json,你可以猴子补丁 BSON::ObjectId :

module BSON
class ObjectId
def to_json(*)
to_s.to_json
end
def as_json(*)
to_s.as_json
end
end
end

我打补丁以避免一直处理 $oid 东西。

就验证而言,我会让每个事物验证其级别的数据。您有两个单独的验证:

  1. 类(class)列表中没有重复。
  2. 每门类(class)都是一门类(class)。

Curriculum 会将列表作为一个整体来处理:

validate :no_duplicates

def no_duplicates
if(course_list.map(&:course_id).uniq.length != course_list.length)
#...
end
end

请注意,我们正在查看嵌入文档中的 course_id 以检查唯一性。每个嵌入的文档都会有自己的_id_id 通常用于比较;我们不关心那些,我们关心独特的类(class),所以这就是我们所关注的。

然后您的Courselist 可以处理其自身的有效性:

validates_presence_of :course

检查 course 是否存在将尝试将类(class)从 MongoDB 中拉出。如果您认为这太昂贵,您可以将其替换为直接存在性检查。

关于ruby - 使用嵌入文档时的 ActiveRecord 嵌套验证 : Mongoid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29612262/

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