clear icon indicating copy to clipboard operation
clear copied to clipboard

pagination errors

Open carcinocron opened this issue 4 years ago • 1 comments

I have a model which is very simple

class Model::Channel
  include Clear::Model
  self.table = "channels"

  column id : Int64, primary: true, presence: false
  column createdby_id : Int64

  column name : String
  column description : String

  column created_at : Time
  column updated_at : Time
end

# paginated query
channels = Model::Channel.query.paginate(1, 15)

after this code, I can't do anything with channels.

  puts channels.size

causes:

In src/app.cr:41:1

 41 | require "./routes"
      ^
Error: while requiring "./routes"


In src/routes.cr:10:1

 10 | require "./routes/channels"
      ^
Error: while requiring "./routes/channels"


In src/routes/channels.cr:12:17

 12 | puts channels.size
                    ^---
Error: instantiating 'Model::Channel::Collection#size()'


In /usr/share/crystal/src/enumerable.cr:1241:5

 1241 | count { true }
        ^----
Error: instantiating 'count()'


In /usr/share/crystal/src/enumerable.cr:243:30

 243 | each { |e| count += 1 if yield e }
                                ^
Error: can't use `yield` inside a proc literal or captured block

Make sure to read the whole docs section about blocks and procs,
including "Capturing blocks" and "Block forwarding":

http://crystal-lang.org/docs/syntax_and_semantics/blocks_and_procs.html

and

  channels.each do |c|
    puts c
  end

causes:

In src/app.cr:41:1

 41 | require "./routes"
      ^
Error: while requiring "./routes"


In src/routes.cr:10:1

 10 | require "./routes/channels"
      ^
Error: while requiring "./routes/channels"


In src/routes/channels.cr:14:12

 14 | channels.each do |c|
               ^---
Error: instantiating 'Model::Channel::Collection#each()'


In lib/clear/src/clear/model/collection.cr:307:40

 307 | o << Clear::Model::Factory.build(type, hash, persisted: true, fetch_columns: fetch_columns, cache: @cache).as(T)
                                  ^----
Error: instantiating 'Clear::Model::Factory:Module#build(String, Hash(String, Array(JSON::Any) | Array(PG::BoolArray) | Array(PG::CharArray) | Array(PG::Float32Array) | Array(PG::Float64Array) | Array(PG::Int16Array) | Array(PG::Int32Array) | Array(PG::Int64Array) | Array(PG::NumericArray) | Array(PG::StringArray) | Array(PG::TimeArray) | Bool | Char | Clear::Expression::UnsafeSql | Float32 | Float64 | Hash(String, JSON::Any) | Int16 | Int32 | Int64 | Int8 | JSON::Any | PG::Geo::Box | PG::Geo::Circle | PG::Geo::Line | PG::Geo::LineSegment | PG::Geo::Path | PG::Geo::Point | PG::Geo::Polygon | PG::Numeric | Slice(UInt8) | String | Time | UInt16 | UInt32 | UInt64 | UInt8 | Nil))'


There was a problem expanding macro '__register_factory__'

Called macro defined in lib/clear/src/clear/model/modules/has_factory.cr:30:3

 30 | macro __register_factory__

Which expanded to:

 > 1 |     
 > 2 |       __default_factory__
 > 3 |     
 > 4 |   
Error: expanding macro


There was a problem expanding macro '__default_factory__'

Called macro defined in lib/clear/src/clear/model/modules/has_factory.cr:23:3

 23 | macro __default_factory__

Which expanded to:

 > 1 |     Clear::Model::Factory.add("Model::Channel", ::Clear::Model::Factory::SimpleFactory(Model::Channel).new)
 > 2 |   
Error: undefined constant Model::Channel

carcinocron avatar Jan 29 '20 03:01 carcinocron

That's a problem I know exists and should be fixed.

Basically, you should use channels.count or channels.to_a.size

For explanation, I've made the collection object inheriting from enumerator class, which is probably not the best idea.

anykeyh avatar Feb 02 '20 04:02 anykeyh