gpt4 book ai didi

ruby - 如何让 (Ruby) DataMapper 自定义类型工作?

转载 作者:数据小太阳 更新时间:2023-10-29 08:18:58 26 4
gpt4 key购买 nike

我有一个代表上课日的 SchoolDay 类:它可以告诉您日期、学期、学期、星期和星期几。它可以生成类似“Sem1 13A Fri”的字符串。为了将这些对象存储在数据库中,我希望将它们序列化为字符串。

这是我的 DataMapper 自定义类型代码。我从 dm-types 中的代码中提取了一些想法,因为(令人失望的是)没有用于创建自定义类型的真实文档。抱歉,太长了。

module DataMapper
class Property
class SchoolDay < DataMapper::Property::String

#load_as ::SchoolRecord::DomainObjects::SchoolDay
# Commented out: the 'load_as' method is not found

def load(value)
# Take a string from the database and load it. We need a calendar!
val = case value
when ::String then calendar.schoolday(value)
when ::SR::DO::SchoolDay then value
else
# fail
end
end

def dump(value)
# Store a SchoolDay value into the database as a string.
case value
when SR::DO::SchoolDay
sd = value
"Sem#{sd.semester} #{sd.weekstr} #{sd.day}"
when ::String
value
else
# fail
end
end

def typecast(value)
# I don't know what this is supposed to do -- that is, when and why it
# is called -- but I am aping the behaviour of the Regexp custom type,
# which, like this one, stores as a String and loads as something else.
load(value)
end

# private methods calendar() and error_message() omitted
end
end
end

此代码适用于从 (SQLite) 数据库读取,但不适用于创建新行。错误信息是:

Schoolday must be of type String

定义 DataMapper 资源并尝试创建记录的代码是:

class LessonDescription
include DataMapper::Resource
property :id, Serial
property :schoolday, SchoolDay # "Sem1 3A Fri"
property :class_label, String # "10"
property :period, Integer # (0..6), 0 being before school
property :description, Text # "Completed yesterday's worksheet. hw:(4-07)"
end

# ...

ld = LessonDescription.create(
schoolday: @schoolday,
class_label: @class_label,
period: @period,
description: description
)

这是 dm-types 库中 Regexp 数据映射器类型的代码。就这么简单!

module DataMapper
class Property
class Regexp < String
load_as ::Regexp # NOTE THIS LINE

def load(value)
::Regexp.new(value) unless value.nil?
end

def dump(value)
value.source unless value.nil?
end

def typecast(value)
load(value)
end

end
end
end

出于某种原因,我无法在我的代码中使用 load_as 行。

总结一下:我正在尝试创建一个在 SchoolDay(域对象)和 String(数据库表示)之间进行转换的自定义类型。翻译很简单,我主要从 DataMapper Regexp 类型复制了代码结构。但是当我试图保存一个 SchoolDay 时,它提示说我没有给它一个字符串。令人沮丧的是,我不能使用内置和自定义类型 all 使用的“load_as”方法,即使我有最新的 gem。我也找不到在 DataMapper 的源代码中任何地方定义的“load_as”方法。但是它叫!

抱歉太长了。非常感谢任何帮助,以及指向创建这些我不知何故错过的东西的指南的指针。

最佳答案

github 上 dm-types 的当前代码似乎还没有发布到任何官方版本——这就是 load_as 在您的示例中不起作用的原因。但是尝试添加这个方法:

module DataMapper
class Property
class SchoolDay < DataMapper::Property::String

def custom?
true
end

end
end
end

这在这里起作用。

关于ruby - 如何让 (Ruby) DataMapper 自定义类型工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9481513/

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