recomendaciones para el buen uso de querys

Estoy haciendo uso de un query para la busqueda de registros, таблицы DOS танго, una es "venta" y la otra es "detallevet" (esta hace referencia los detalles de la venta) mediante este запрашивают procedo hacer la busqueda de las ventas en su modelo correspondient

  def self.busqueda_general(params)
  query = joins("left outer join detallevet on venta.Documento=detallevet.Docto and venta.RutaId=detallevet.RutaId")
                     .where("(venta.RutaId = :rutaId or :rutaId = '') AND (detallevet.Articulo = :articulo or :articulo = '')  AND (venta.CodCliente = :codcliente or :codcliente = '')",{rutaId: params[:search], articulo: params[:search3], codcliente: params[:search2]})
                     .distinct
  end

luego llamo dicho metodo en el controller en un metodo llamado busqueda_ventas

  def busqueda_ventas
   @detallevet = Detalleve.all
    @ventas = Vent.busqueda_general(params)

    respond_to do |format|
    format.js
    end
  end

las ventas estan relacionadas Лос detalleventa pero никакая por бразильская саванна ООН venta_id que los identifique, китайская por середина месяца de DOS Кампус, uno таблицы llamado documento y otro RutaId en ambas, ambas combinaciones deben de ser iguales para relacionarse. перспектива ми en estoy ordenando жабы mis ventas подставляет sus detalles respectivamente, жабы para hacer esto en metodo del controller busque форма los detalle de esta @detallevet = Detalleve.all y en la vista hice un render de la siguiente manera

<%= render `@detallevet.where(:Docto => vent.Documento, :RutaId => vent.RutaId) %>

al igual que para el mostrado de datos:

 <td><%=vent.IVA%></td>
        <td><%=@detallevet.where(:Docto => vent.Documento, :RutaId => vent.RutaId ).sum(:DescMon)%></td>
        <td><%=vent.TOTAL%></td>
        <td><%=@detallevet.where(:Docto => vent.Documento, :RutaId => vent.RutaId).count%></td>

        <td><%=@detallevet.where(:Docto => vent.Documento, :RutaId => vent.RutaId).sum(:Pza)%></td>

pero я методы parece que estoy haciendo uso de malas colocando ese tipo de consultas en la vista, y de ser asi de que forma podria mejorarlo?

CODIGO ACTUALIZADO:

  has_many :detallevet, -> (vent) { where(Docto: vent.Documento, RutaId: vent.RutaId) },
           class_name: 'Detalleve'
2
задан 28.12.2016, 07:55
1 ответ

Я верю в то, что главная проблема твоего осуществления (помимо главный файл MVC не остается, как он соответствует делая консультацию в виде), он состоит в том, что из-за каждой продажи ты реализуешь 3 консультации в базу данных, вызываешь 3N + 1 ты консультируешься, будучи N количество продаж будучи нужно показывать которое (Эдж: Если твоя консультация @ventas = Vent.busqueda_general(params) он возвращает тебе 20 реестров, чтобы показывать весь info в виде, ты закончил тем, что реализовал 61 консультацию в базу данных вместо только одной).
Я использовал бы join, который ты реализуешь в busqueda_general и он добавил бы все эти sum и count, который ты сделал в виде в консультацию (обрати внимание в select):

  def self.busqueda_general(params)
    select("venta.*, COUNT(detallevet.*) AS venta_count,
            SUM(detallevet.DescMon) AS sum_DescMon,
            SUM(detallevet.Pza) AS sum_Pza")
      .joins("LEFT OUTER JOIN detallevet ON venta.Documento=detallevet.Docto
              AND venta.RutaId=detallevet.RutaId")
      .where("(venta.RutaId = :rutaId OR :rutaId = '')
              AND (detallevet.Articulo = :articulo OR :articulo = '')
              AND (venta.CodCliente = :codcliente OR :codcliente = '')",
             rutaId: params[:search], articulo: params[:search3],
             codcliente: params[:search2])
      .group(:id)
      .distinct
  end

Потом в виде он назвал бы sumatorias и счетчик каждой продажи, основываясь на прозвище, которое я поместил с AS внутри select:

<td><%=vent.IVA%></td>
<td><%=vent.sum_DescMon)%></td>
<td><%=vent.TOTAL%></td>
<td><%=vent.venta_count%></td>
<td><%=vent.sum_Pza)%></td>

Чтобы соглашаться на детали продажи, просто помести один has_many с условиями:

has_many :detalles, -> (vent) { where(Docto: vent.Documento, RutaId: vent.RutaId) },
         class_name: 'Detalleve'

потом ты звонишь в:

vent.detalles
1
ответ дан 24.11.2019, 12:02
  • 1
    спасибо за ответ. я пробую размещать это, такой который ты это напечатал, но меня отпускает ошибка в конечной остановке в консультации, это следующий: ActionView:: Сдержись:: Ошибка (TinyTds:: Ошибка: Incorrect syntax near ' * '.: EXEC sp_executesql N' SELECT DISTINCT продажа.*, COUNT (detallevet.*) ЭКСПЕРТ venta_count, SUM (detallevet. DescMon) ЭКСПЕРТ sum_DescMon, SUM (detallevet. Pza) ЭКСПЕРТ sum_Pza FROM [продажа] LEFT OUTER JOIN detallevet ON продажа. Documento=detallevet. Ученый AND продажа. RutaId=detallevet. RutaId WHERE ((продажа. RutaId = N' ' 172' ' OR N' ' 172' ' = ' ' ' ') – LuisC 23.12.2016, 23:23
  • 2
    @LuisC ни правда ни идея я не имею sql server, так как никогда я это не использовал, но, как кажется, синтаксис, который ты помещаешь вручную, должен идти заключенная между квадратными скобками, чем-то как select("[venta].*, COUNT([detallevet].*) AS venta_count, как он выходит в консультациях из этого ответа – Alter Lagos 24.12.2016, 01:39
  • 3
    спасибо Alter, я это изменил формы на, о котором ты упомянул мне, и кроме того изменился ему в простые кавычки и я функционирую, но сейчас он посылает мне ошибку в select, я пробую несколько комбинаций, чтобы стараться заставлять это функционировать, и ощутился, что, если я оставляю [продажу].*, он не дает вышеупомянутую ошибку – LuisC 24.12.2016, 03:45
  • 4
    но если я кроме того добавляю методы count с другой таблицей, он дает мне следующую ошибку: Column ' продажа. Id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.: EXEC sp_executesql N' SELECT [продажа].*, SUM ([detallevet].DescMon) ЭКСПЕРТ [sum_DescMon] FROM [продажа] left outer join detallevet ON продажа. Documento=detallevet. Docto'): – LuisC 24.12.2016, 03:45
  • 5
    совершенный уже напечатайте мое другое сомнение, большое спасибо Alter помогать мне исправлять мой код, у тебя нет идеи обо всем, что подало мне твою помощь, большое спасибо, друг. – LuisC 28.12.2016, 17:26