@@ -2149,4 +2149,77 @@ describe "lapis.db.model.relations", ->
21492149 [[ SELECT * FROM "user_tags" WHERE "user_id" IN ('uid-123', 'uid-999')]]
21502150 }
21512151
2152+ describe " has_many with computed key returning list" , ->
2153+ local Users , UserTags
2154+
2155+ before_each ->
2156+ models. Users = class Users extends Model
2157+ @relations : {
2158+ { " tags" , has_many : " UserTags" , key : {
2159+ user_id : ( user) -> db. list user. tag_owner_ids
2160+ }}
2161+ }
2162+
2163+ models. UserTags = class UserTags extends Model
2164+
2165+
2166+ it " fetches with getter" , ->
2167+ mock_query " SELECT" , {
2168+ { id : 101 , user_id : 10 }
2169+ { id : 102 , user_id : 20 }
2170+ }
2171+
2172+
2173+ user = Users \ load {
2174+ tag_owner_ids : { 10 , 20 }
2175+ }
2176+
2177+ assert . same {
2178+ { id : 101 , user_id : 10 }
2179+ { id : 102 , user_id : 20 }
2180+ } , user\ get_tags!
2181+
2182+ assert_queries {
2183+ [[ SELECT * FROM "user_tags" WHERE "user_id" IN (10, 20)]]
2184+ }
2185+
2186+ it " preloads" , ->
2187+ mock_query " SELECT" , {
2188+ { id : 201 , user_id : 20 }
2189+ { id : 202 , user_id : 30 }
2190+ { id : 203 , user_id : 40 }
2191+ }
2192+
2193+ import preload from require " lapis.db.model"
2194+ users = {
2195+ Users \ load {
2196+ tag_owner_ids : { 20 }
2197+ }
2198+ Users \ load {
2199+ tag_owner_ids : { 30 , 40 }
2200+ }
2201+ Users \ load {
2202+ tag_owner_ids : { 10 , 20 }
2203+ }
2204+ }
2205+
2206+ preload users, " tags"
2207+
2208+ assert_queries {
2209+ [[ SELECT * FROM "user_tags" WHERE "user_id" IN (20, 30, 40, 10)]]
2210+ }
2211+
2212+ assert . same {
2213+ { id : 201 , user_id : 20 }
2214+ } , users[ 1 ] . tags
2215+
2216+ assert . same {
2217+ { id : 202 , user_id : 30 }
2218+ { id : 203 , user_id : 40 }
2219+ } , users[ 2 ] . tags
2220+
2221+ assert . same {
2222+ { id : 201 , user_id : 20 }
2223+ } , users[ 3 ] . tags
2224+
21522225
0 commit comments