On Wednesday, December 28, 2016 at 10:03:55 PM UTC-8, Greg Gilbert wrote:
>
> Hey,
>
> I put together a proof of concept using Docker:
> https://github.com/greggilbert/sequel-association-test
>
> If you look at doit.rb, you'll see two queries. The first one doesn't
> work (i.e. returns nil) but the second one does. I guess there's
> something about the eager_limit that's not right? And if you leave out
> the .eager line altogether, you get the first VendorRevision for each,
> not the last.
>
> Let me know if there's anything else I can clarify.
>
In the future, please do not submit examples that use docker, or split code
between multiple files. Please combine all code in a single post to this
list. This saves me time as I wouldn't have to go through 4 separate files
to piece together a working example just to provide support. Below is a
self contained example I made from your repo that is runnable with
bin/sequel (e.g. ruby bin/sequel -E sqlite:/ filename.rb).
In any case, :eager_limit should not be used for one_to_one associations,
and it doesn't make sense to use it as the limit should always be 1 anyway
(it can make sense for *_to_many associations). Using :eager_limit for
one_to_one associations is undefined behavior, so the fact that it breaks
something is not a bug.
You'll notice in the code below that I commented out the :order option to
the last_edit association. From looking at your example, I would guess
that you would want to specify that option, and then you'll be able to use
the last block in the example, which doesn't use an eager callback. This
is best as it produces the most optimized query. It seems to me unlikely
that you'd ever want to use the last_edit association without a reverse
chronological order.
Thanks,
Jeremy
DB.instance_exec do
create_table(:users) do
primary_key :id
String :email, null: false
String :password_hash, null: false
DateTime :created_at, null: false, default: Sequel::CURRENT_TIMESTAMP
DateTime :updated_at, null: false, default: Sequel::CURRENT_TIMESTAMP
end
create_table(:vendors) do
primary_key :id
foreign_key :user_id, :users
Boolean :is_verified, default: false
end
create_table(:vendor_revisions) do
primary_key :id
foreign_key :vendor_id, :vendors, null: false, index: true
String :name, null: false, index: true
DateTime :created_at, default: Sequel::CURRENT_TIMESTAMP
DateTime :updated_at, default: Sequel::CURRENT_TIMESTAMP
end
alter_table(:vendors) do
add_foreign_key :latest_revision, :vendor_revisions, null: true
end
end
class User < Sequel::Model
one_to_many :vendors
end
class VendorRevision < Sequel::Model
many_to_one :vendor
end
VendorRevision.plugin :timestamps, update_on_create: true
class Vendor < Sequel::Model
one_to_many :vendor_revisions, class: VendorRevision
many_to_one :user
end
Vendor.one_to_one :last_edit, :class => :VendorRevision#,
:order=>Sequel.desc(:created_at)
u1 = User.create(:email => '[email protected]', password_hash: 'foo')
u2 = User.create(:email => '[email protected]', password_hash: 'foo')
v1 = Vendor.create(:user_id => u1.id)
v2 = Vendor.create(:user_id => u1.id)
v3 = Vendor.create(:user_id => u2.id)
vr1 = VendorRevision.create(:vendor_id => v1.id, :name => 'Test one')
vr3 = VendorRevision.create(:vendor_id => v2.id, :name => 'Test three')
vr2 = VendorRevision.create(:vendor_id => v1.id, :name => 'Test two')
vr4 = VendorRevision.create(:vendor_id => v2.id, :name => 'Test four')
vendors = Vendor
.where(:user_id => 1)
.eager(:last_edit => proc {|ds|
ds.reverse_order(:created_at).clone(:eager_limit => 1) })
.all
vendors.each do |v|
p v.last_edit
p '-'*50
end
vendors = Vendor
.where(:user_id => 1)
.eager(:last_edit => proc {|ds| ds.reverse_order(:created_at)
})
.all
vendors.each do |v|
p v.last_edit
p '-'*50
end
vendors = Vendor
.where(:user_id => 1)
.eager(:last_edit)
.all
vendors.each do |v|
p v.last_edit
p '-'*50
end
--
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.