diff --git a/lapis/db/model/relations.lua b/lapis/db/model/relations.lua index 03679d71..a9bba0ac 100644 --- a/lapis/db/model/relations.lua +++ b/lapis/db/model/relations.lua @@ -45,7 +45,7 @@ local preload local preload_relation preload_relation = function(self, objects, name, ...) local optional - if name:sub(1, 1) == "?" then + if type(name) == "string" and name:sub(1, 1) == "?" then name = name:sub(2) optional = true end @@ -79,10 +79,12 @@ preload_homogeneous = function(sub_relations, model, objects, front, ...) for key, val in pairs(front) do local _continue_0 = false repeat - local relation = type(key) == "string" and key or val - local preload_opts = type(val) == "table" and val[preload] or nil + local val_type = type(val) + local key_type = type(key) + local relation = key_type == "string" and key or val + local preload_opts = val_type == "table" and val[preload] or nil preload_relation(model, objects, relation, preload_opts) - if type(key) == "string" then + if key_type == "string" and (val_type == "string" or val_type == "table") then local optional, relation_name if key:sub(1, 1) == "?" then optional, relation_name = true, key:sub(2) diff --git a/lapis/db/model/relations.moon b/lapis/db/model/relations.moon index 13d3e355..5d79a4b2 100644 --- a/lapis/db/model/relations.moon +++ b/lapis/db/model/relations.moon @@ -26,7 +26,7 @@ local preload -- ...: options passed to preloader preload_relation = (objects, name, ...) => -- relations prefixed with ? are optional loads, we can skip it if it doesn't exist - optional = if name\sub(1,1) == "?" + optional = if type(name) == "string" and name\sub(1,1) == "?" name = name\sub 2 true @@ -61,15 +61,21 @@ preload_homogeneous = (sub_relations, model, objects, front, ...) -> if type(front) == "table" for key, val in pairs front - relation = type(key) == "string" and key or val + val_type = type val + key_type = type key + + relation = key_type == "string" and key or val -- this lets you set pass preload opts by using the reference to the -- preload function as a special key - preload_opts = type(val) == "table" and val[preload] or nil + preload_opts = val_type == "table" and val[preload] or nil preload_relation model, objects, relation, preload_opts - if type(key) == "string" + -- are there sub-relations to preload? + -- { parent: "child" } + -- { parent: {"child1", "child2"} } + if key_type == "string" and (val_type == "string" or val_type == "table") optional, relation_name = if key\sub(1,1) == "?" true, key\sub 2 else