我将courselist文档嵌入称为课程的父文档中。 courselist属于模范课程。
courselist模型:
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"
Curriculum.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
在课程路线上执行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"
}
}
]
}
我的怀疑:
如何验证课程列表中所有对象的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:上面的验证是在嵌入式父模型上完成的。应该在孩子身上完成吗?还是在父母身边?或者没关系? 提前致谢。
答案 0 :(得分:0)
那些$oid
内容正是BSON::ObjectId
将自身序列化为JSON的方式。您可以自行解包,或者如果您想继续在模型实例上使用as_json
和to_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
内容。
就验证而言,我会让每件事都验证其级别的数据。您有两个单独的验证:
Curriculum
将整体处理该列表:
validate :no_duplicates
def no_duplicates
if(course_list.map(&:course_id).uniq.length != course_list.length)
#...
end
end
请注意,我们正在查看嵌入文档中的course_id
以检查唯一性。每个嵌入的文档都将获得自己的_id
,而_id
是通常用于比较的内容;我们不关心这些,我们关心的是独特的课程,这就是我们所看到的。
然后你的Courselist
可以照顾自己的有效性:
validates_presence_of :course
检查course
是否存在将尝试将课程从MongoDB中拉出来。如果您认为这太贵了,可以用直接存在检查替换它。