Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Hello
- I would like to preload associations but if no associations exist I would like to return the inital AR relation.
- To understand my issue here is a reproducible script :
- ```ruby
- gem 'rails'
- require 'active_record'
- puts "Active Record #{ActiveRecord::VERSION::STRING}"
- ActiveRecord::Base.establish_connection(
- adapter: 'sqlite3',
- database: ':memory:'
- )
- ActiveRecord::Schema.define do
- create_table :organisations, force: true do |t|
- t.string 'name', limit: 255, null: false
- t.datetime 'created_at'
- t.datetime 'updated_at'
- end
- create_table :groups, force: true do |t|
- t.string 'name', limit: 255, null: false
- t.integer 'shop_id', null: false
- t.datetime 'created_at'
- t.datetime 'updated_at'
- end
- create_table :groups_organisations, force: true do |t|
- t.integer 'organisation_id', null: false
- t.integer 'group_id', null: false
- t.datetime 'created_at'
- t.datetime 'updated_at'
- end
- end
- class Organisation < ActiveRecord::Base
- has_many :groups_organisations
- has_many :groups, through: :groups_organisations
- end
- class Group < ActiveRecord::Base
- has_many :groups_organisations
- has_many :organisation, through: :groups_organisations
- end
- class GroupsOrganisation < ActiveRecord::Base
- belongs_to :group
- belongs_to :organisation
- end
- organisation_without_groups = Organisation.create!(name: 'my organisation without groups')
- group_1 = Group.create!(name: 'group_1', shop_id: 1)
- group_2 = Group.create!(name: 'group_2', shop_id: 2)
- organisation_with_groups = Organisation.create!(name: 'my organisation with groups', groups: [group_1, group_2])
- ```
- When I don't have records associated
- ```ruby
- p Organisation.where(name: 'my organisation without groups').includes(:groups).where(groups: { shop_id: 1 })
- # <ActiveRecord::Relation []>
- ```
- When I have records to include
- ```ruby
- p Organisation.where(name: 'my organisation with groups').includes(:groups).where(groups: { shop_id: 1 })
- # <ActiveRecord::Relation [#<Organisation id: 2, name: "my organisation with groups", created_at: "2017-07-21 09:45:07", updated_at: "2017-07-21 09:45:07">]>
- ```
- Where clause is performed on all the query not on the LEFT OUTER JOIN
- ```sql
- SELECT "organisations"."id" AS t0_r0,
- "organisations"."name" AS t0_r1,
- "organisations"."created_at" AS t0_r2,
- "organisations"."updated_at" AS t0_r3,
- "groups"."id" AS t1_r0,
- "groups"."name" AS t1_r1,
- "groups"."shop_id" AS t1_r2,
- "groups"."created_at" AS t1_r3,
- "groups"."updated_at" AS t1_r4
- FROM "organisations"
- LEFT OUTER JOIN "groups_organisations"
- ON "groups_organisations"."organisation_id" = "organisations"."id"
- LEFT OUTER JOIN "groups"
- ON "groups"."id" = "groups_organisations"."group_id"
- WHERE "organisations"."name" = 'my organisation without groups'
- AND "groups"."shop_id" = 1
- ```
- What I would like is :
- ```sql
- LEFT OUTER JOIN "groups"
- ON "groups"."id" = "groups_organisations"."group_id"
- AND groups.store_id = 20441
- WHERE "organisations"."name" = 'my organisation without groups'
- ```
- Is it possible to preload using LEFT OUTER JOIN with conditionals?
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement