diff --git a/spec/serializable_spec.cr b/spec/serializable_spec.cr index 4ad2cf98..c70fc880 100644 --- a/spec/serializable_spec.cr +++ b/spec/serializable_spec.cr @@ -104,6 +104,23 @@ struct ModelWithEnum end end +# Ensure types that happen to have the same name as types within the `DB` +# namespace don't clash here +struct Transaction + include DB::Serializable + + @[DB::Field(key: "c0")] + getter id : Int32 + @[DB::Field(key: "c1")] + getter status : Status + + enum Status + Pending + Complete + Canceled + end +end + macro from_dummy(query, type) with_dummy do |db| rs = db.query({{ query }}) @@ -206,6 +223,13 @@ describe "DB::Serializable" do end end + it "should compile when top-level names collide with DB-namespaced names" do + expect_model("1,Pending", Transaction, { + id: 1, + status: Transaction::Status::Pending, + }) + end + it "should initialize multiple instances from a single resultset" do with_dummy do |db| db.query("1,a 2,b") do |rs| diff --git a/src/db/serializable.cr b/src/db/serializable.cr index ce92ca66..3ec448c8 100644 --- a/src/db/serializable.cr +++ b/src/db/serializable.cr @@ -109,7 +109,11 @@ module DB {% unless ann && ann[:ignore] %} {% properties[ivar.id] = { - type: ivar.type, + type: if ivar.type.union? + "Union(#{ivar.type.union_types.map { |t| "::#{t}".id }.join(" | ").id})".id + else + "::#{ivar.type}".id + end, key: ((ann && ann[:key]) || ivar).id.stringify, default: ivar.default_value, nilable: ivar.type.nilable?,