On Sunday, August 7, 2016 at 1:22:55 PM UTC-7, Denis Chernov wrote:
>
> I discovered a strange behaviour on join query generation today. Tried 
> searching the docs and this group, but to no avail.
> Code speaks better than words so I'll just show it as is. The table 
> structure is as follows:
>
> create_table(:langs) do
>   primary_key :id
>     column :lang_name, 'VARCHAR(64)', null: false
>   constraint(:language_name_min_length) { char_length(lang_name) > 0 }
> end
>
> create_table(:books) do
>   # Keys
>   primary_key :id
>   foreign_key :original_lang, :langs
>   foreign_key :translated_lang, :langs
>
>   # Metadata
>   column :created_at, 'TIMESTAMP WITH TIME ZONE', null: false, default: 
> 'NOW()'
>   column :updated_at, 'TIMESTAMP WITH TIME ZONE', null: false, default: 
> 'NOW()'
>   column :type, 'SMALLINT', null: false
>
>   # Select data
>     column :original_title, 'VARCHAR(128)', null: false, unique: true
>   column :translated_title, 'VARCHAR(128)', null: false, unique: true
>   column :description, 'TEXT'
>
>   # Constraints
>   constraint(:original_title_min_length) { char_length(original_title) > 5 
> }
>   constraint(:translated_title_min_length) { char_length(translated_title) 
> > 5 }
>
>   # Indexes
>   index :id, where: { type: 0 }
> end
>
> alter_table :books do
>   set_column_not_null :translated_lang
>   set_column_not_null :original_lang
> end
>
> The query is a follows:
>
> DB[:books].left_join(:langs___original_langs, { :id => :original_lang })
>   .left_join(:langs___translated_langs, { :id => :translated_lang })
> .select(
>   :books__id___id, # Due to join
>   :original_title,
>   :translated_title,
>   :original_langs__lang_name___original_lang,
>   :translated_langs__lang_name___translated_lang,
>   :type
> )
>
> I'm not sure whether I misunderstood the docs and made some mistake or it 
> really is a bug, but it gives me an error and postgres logs show this:
>
> ERROR:  column books.langs does not exist at character 237
> STATEMENT:  SELECT "books"."id" AS "id", "original_title", 
> "translated_title", "original_langs"."lang_name", 
> "translated_langs"."lang_name" AS "translated_lang", "type" FROM "books" 
> LEFT JOIN "langs" AS "original_langs" ON ("original_langs"."id" = 
> "books"."langs") LEFT JOIN "langs" AS "translated_langs" ON 
> ("translated_langs"."id" = "books"."langs")
>
> Sequel version is 4.37.0 and postgres 9.5.3.
>
>
I can't recreate the error.  Here's the SQL code I get for your query:

SELECT books.id AS id, original_title, translated_title, 
original_langs.lang_name AS original_lang, translated_langs.lang_name AS 
translated_lang, type FROM books LEFT JOIN langs AS original_langs ON 
(original_langs.id = books.original_lang) LEFT JOIN langs AS 
translated_langs ON (translated_langs.id = original_langs.translated_lang)

There is an error in your code, in that the 2nd join uses the wrong key 
(original_langs.translated_lang instead of books.translated_lang).  You can 
fix that:

DB[:books].left_join(:langs___original_langs, { :id => :original_lang })
  .left_join(:langs___translated_langs, { :id => :books__translated_lang })

Thanks,
Jeremy

-- 
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