> I'm not sure exactly what you want. My guess is you either want to pass a
> block to one_to_many, or to use the :dataset option  Can you please provide
> a minimal self contained example, as well as the SQL you want to generate?

here is script:

    require 'sequel'

    Sequel.extension :s
    Sequel::Model.plugin :association_proxies
    Sequel::Model.plugin :dataset_associations
    Object.send(:include, Sequel::S)

    DB = Sequel.sqlite

    DB.create_table :zoings do
      primary_key :id
      foreign_key :blorl_id, :blorls
      DateTime :t
    end

    DB.create_table :blorls do
      primary_key :id
      DateTime :magic_t
    end

    class Zoing < Sequel::Model
    end

    class Blorl < Sequel::Model
      one_to_many :zoings

      one_to_many(
        :magic_zoings,
        clone: :zoings,
        graph_block: proc { |j, lj, js| S(j)[:t] < S(lj)[:magic_t] }
      )

      one_to_many(
        :condition_magic_zoings,
        clone: :magic_zoings,
        conditions: proc { created_at < magic_t } # wat
      )

      one_to_many(
        :block_magic_zoings,
        clone: :magic_zoings
      ) do |ds|
        ds.where(S(:t) < magic_t) # crash for dataset_associations
      end

      one_to_many(
        :dataset_magic_zoings,
        clone: :magic_zoings,
        dataset: proc do |r|
          # doesnt work for dataset_associations
          Blorl
            .association_join(:dataset_magic_zoings)
            .with_row_proc(Zoing)
            .select_all(:dataset_magic_zoings)
        end
      )

      one_to_many(
        :works_magic_zoings,
        clone: :magic_zoings
      ) do |ds|
        # works, but always join
        Blorl
          .association_join(:works_magic_zoings)
          .with_row_proc(Zoing)
          .select_all(:works_magic_zoings)
      end
    end

    t = Time.now
    blorl = Blorl.create(magic_t: t)
    (-10..+10).each {|u| blorl.add_zoing(t: t+u)}

    def ev4l(x, y)
      %W(
        Blorl.first.#{x}.#{y}
        Blorl.association_join(:#{x}).#{y}
        Blorl.#{x}.#{y}
      ).each do |l|
        s =
          begin
            eval(l)
          rescue => e
            e.class.name.to_s
          end

        puts("#{l} # => #{s}")
      end
    end

    Blorl.first.block_magic_zoings.count

    puts("#")
    puts("# only joins")
    puts("#")
    ev4l('magic_zoings', 'sql')
    puts("")
    ev4l('magic_zoings', 'count')
    puts("")

    puts("#")
    puts("# just broken")
    puts("#")
    ev4l('condition_magic_zoings', 'sql')
    puts("")
    ev4l('condition_magic_zoings', 'count')
    puts("")

    puts("#")
    puts("# crash dataset_associations")
    puts("#")
    ev4l('block_magic_zoings', 'sql')
    puts("")
    ev4l('block_magic_zoings', 'count')
    puts("")

    puts("#")
    puts("# doesnt work for dataset_associations")
    puts("#")
    ev4l('dataset_magic_zoings', 'sql')
    puts("")
    ev4l('dataset_magic_zoings', 'count')
    puts("")

    puts("#")
    puts("# works but always join")
    puts("#")
    ev4l('works_magic_zoings', 'sql')
    puts("")
    ev4l('works_magic_zoings', 'count')
    puts("")


here is output:

    #
    # only joins
    #
    Blorl.first.magic_zoings.sql # => SELECT * FROM `zoings` WHERE
(`zoings`.`blorl_id` = 1)
    Blorl.association_join(:magic_zoings).sql # => SELECT * FROM
`blorls` INNER JOIN `zoings` AS 'magic_zoings' ON
((`magic_zoings`.`blorl_id` = `blorls`.`id`) AND (`magic_zoings`.`t` <
`blorls`.`magic_t`))
    Blorl.magic_zoings.sql # => SELECT * FROM `zoings` WHERE
(`zoings`.`blorl_id` IN (SELECT `blorls`.`id` FROM `blorls`))

    Blorl.first.magic_zoings.count # => 21
    Blorl.association_join(:magic_zoings).count # => 10
    Blorl.magic_zoings.count # => 21

    #
    # just broken
    #
    Blorl.first.condition_magic_zoings.sql # => SELECT * FROM `zoings`
WHERE ((`created_at` < `magic_t`) AND (`zoings`.`blorl_id` = 1))
    Blorl.association_join(:condition_magic_zoings).sql # => SELECT *
FROM `blorls` INNER JOIN `zoings` AS 'condition_magic_zoings' ON
((`condition_magic_zoings`.`blorl_id` = `blorls`.`id`) AND
(`condition_magic_zoings`.`t` < `blorls`.`magic_t`))
    Blorl.condition_magic_zoings.sql # => SELECT * FROM `zoings` WHERE
((`zoings`.`blorl_id` IN (SELECT `blorls`.`id` FROM `blorls`)) AND
(`created_at` < `magic_t`))

    Blorl.first.condition_magic_zoings.count # => Sequel::DatabaseError
    Blorl.association_join(:condition_magic_zoings).count # => 10
    Blorl.condition_magic_zoings.count # => Sequel::DatabaseError

    #
    # crash dataset_associations
    #
    Blorl.first.block_magic_zoings.sql # => SELECT * FROM `zoings`
WHERE ((`zoings`.`blorl_id` = 1) AND (`t` < '2017-04-29
16:46:49.750731'))
    Blorl.association_join(:block_magic_zoings).sql # => SELECT * FROM
`blorls` INNER JOIN `zoings` AS 'block_magic_zoings' ON
((`block_magic_zoings`.`blorl_id` = `blorls`.`id`) AND
(`block_magic_zoings`.`t` < `blorls`.`magic_t`))
    Blorl.block_magic_zoings.sql # => NameError

    Blorl.first.block_magic_zoings.count # => 10
    Blorl.association_join(:block_magic_zoings).count # => 10
    Blorl.block_magic_zoings.count # => NameError

    #
    # doesnt work for dataset_associations
    #
    Blorl.first.dataset_magic_zoings.sql # => SELECT
`dataset_magic_zoings`.* FROM `blorls` INNER JOIN `zoings` AS
'dataset_magic_zoings' ON ((`dataset_magic_zoings`.`blorl_id` =
`blorls`.`id`) AND (`dataset_magic_zoings`.`t` < `blorls`.`magic_t`))
    Blorl.association_join(:dataset_magic_zoings).sql # => SELECT *
FROM `blorls` INNER JOIN `zoings` AS 'dataset_magic_zoings' ON
((`dataset_magic_zoings`.`blorl_id` = `blorls`.`id`) AND
(`dataset_magic_zoings`.`t` < `blorls`.`magic_t`))
    Blorl.dataset_magic_zoings.sql # => SELECT * FROM `zoings` WHERE
(`zoings`.`blorl_id` IN (SELECT `blorls`.`id` FROM `blorls`))

    Blorl.first.dataset_magic_zoings.count # => 10
    Blorl.association_join(:dataset_magic_zoings).count # => 10
    Blorl.dataset_magic_zoings.count # => 21

    #
    # works but always join
    #
    Blorl.first.works_magic_zoings.sql # => SELECT
`works_magic_zoings`.* FROM `blorls` INNER JOIN `zoings` AS
'works_magic_zoings' ON ((`works_magic_zoings`.`blorl_id` =
`blorls`.`id`) AND (`works_magic_zoings`.`t` < `blorls`.`magic_t`))
    Blorl.association_join(:works_magic_zoings).sql # => SELECT * FROM
`blorls` INNER JOIN `zoings` AS 'works_magic_zoings' ON
((`works_magic_zoings`.`blorl_id` = `blorls`.`id`) AND
(`works_magic_zoings`.`t` < `blorls`.`magic_t`))
    Blorl.works_magic_zoings.sql # => SELECT `works_magic_zoings`.*
FROM `blorls` INNER JOIN `zoings` AS 'works_magic_zoings' ON
((`works_magic_zoings`.`blorl_id` = `blorls`.`id`) AND
(`works_magic_zoings`.`t` < `blorls`.`magic_t`))

    Blorl.first.works_magic_zoings.count # => 10
    Blorl.association_join(:works_magic_zoings).count # => 10
    Blorl.works_magic_zoings.count # => 10


and here is wat i want:

    something that works liek teh last case, but use WHERE instead of
JOIN on Blorl.first.works_magic_zoings.


> In terms of the dataset_associations plugin (mentioned in the subject of
> your post but not the body), that cannot support instance specific
> associations.  Eager loading via eager cannot support instance specific
> associations either.

i know that is why i supplied a `graph_block`.


> association_datasets_join option doesn't appear to be used anywhere in
> Sequel.

oops i meant `dataset_associations_join` option! tested correctly
without luck! =o(

PS: ty for your patience <3
PS2: sry for word wrapping, it is forced by gmail =o(

-- 
Igor

-- 
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sequel-talk.
For more options, visit https://groups.google.com/d/optout.

Reply via email to