Что .merge () делает в этом запросе? - PullRequest
0 голосов
/ 19 октября 2018

Я немного озадачен тем, как интерпретировать этот запрос, все из-за ситуации merge, даже после прочтения документации.

Я хотел бы знать, каков соответствующий SQL-запрос для следующего

Analise.joins(dape: [empresa: :area_atuacao])
       .merge(@dapes)
       .where(analises: { atual: true })
       .pluck('analises.img')

Вывод из вызова to_sql для этого запроса:

=> "SELECT \"analises\".* 
    FROM \"analises\" 
    INNER JOIN \"dapes\" ON \"dapes\".\"id\" = \"analises\".\"dape_id\" 
    INNER JOIN \"empresas\" ON \"empresas\".\"id\" = \"dapes\".\"empresa_id\" 
    INNER JOIN \"areas_atuacao\" ON \"areas_atuacao\".\"id\" = \"empresas\".\"area_atuacao_id\" 
    WHERE \"analises\".\"atual\" = 't'"

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Здесь ваш формат лучше для лучшей читаемости.Слияние используется для передачи по вашим условиям, так что ничто не может быть переопределено.

SELECT analises.* 
FROM analises
    INNER JOIN dapes ON dapes.id = analises.dape_id
    INNER JOIN empresas ON empresas.id = dapes.empresa_id
    INNER JOIN areas_atuacao ON areas_atuacao.id = empresas.area_atuacao_id
WHERE analises.atual = 't'

Кажется, .merge() используется, когда вы присоединяетесь к таблицам, чтобы быть более точным в отношении того, что именно вы присоединяетесь.

В этом случае вы .merge(@dapes), кажется, объединяете ваши таблицы со всеми значениями @dapes.

Один из способов получить лучшее представление о том, какое влияние .merge (@dapes)на ваш запрос, чтобы снова запустить команду to_sql, как изменился sql.

Сноска

Я взял sql, который был сгенерирован из первого to_sql, который вы запустили и ввелиэто в Редакторе Scuttle и получил следующие команды рельсов.Я не знаю, помогает ли это, но я просто подумал, что это пища для размышлений!

Analise.select(Analise.arel_table[Arel.star]).where(Analise.arel_table[:atual].eq('t')).joins(
  Analise.arel_table.join(Dape.arel_table).on(
    Dape.arel_table[:id].eq(Analise.arel_table[:dape_id])
  ).join_sources
).joins(
  Analise.arel_table.join(Empresa.arel_table).on(
    Empresa.arel_table[:id].eq(Dape.arel_table[:empresa_id])
  ).join_sources
).joins(
  Analise.arel_table.join(AreasAtuacao.arel_table).on(
    AreasAtuacao.arel_table[:id].eq(Empresa.arel_table[:area_atuacao_id])
  ).join_sources
)
0 голосов
/ 19 октября 2018

объединение (другое)
Объединение условий из другого, если другое - ActiveRecord :: Relation.
- Документация по Rails API

Типичным примером является его использование, например, для объединения условий поиска:

@cities = City.all
@cities = @cities.merge(City.where(country: params[:country])) if params[:country]
@cities = @cities.merge(City.where(name: params[:name])) if params[:name]

Вы также можете использовать его для создания условий для объединяемых таблиц, как в этом примере из документов:

Post.where(published: true)
    .joins(:comments)
    .merge( Comment.where(spam: false) )

Это создает тот же запрос, что и:

Post.where(published: true)
    .joins(:comments)
    .where(comments: { spam: false })

Точный запрос в вашем примере зависит от области, определенной в переменной экземпляра @dapes.Но, судя по сгенерированному SQL, .merge(@dapes), похоже, ничего не делает.Это может быть в случае, если, например, @dapes = Dape.all.

Слияние условия с предложением no where ничего не делает:

irb(main):003:0> User.merge(User.all)
  User Load (0.6ms)  SELECT  "users".* FROM "users" LIMIT ?  [["LIMIT", 11]]
=> #<ActiveRecord::Relation []>
irb(main):004:0> 
...