renderizar datos relacionados

Estoy haciendo uso de un query para la busqueda de registros, tengo dos tablas, una es "venta" y la otra es "detallevet"(esta hace referencia a los detalles de la venta) mediante este query procedo a hacer la busqueda de las ventas en su modelo correspondiente:

  def self.busqueda_general(params)
  query = select('[venta].Id,[venta].RutaId,[venta].VendedorId,[venta].CodCliente,[venta].Documento,[venta].Fecha,[venta].TipoVta,[venta].DiasCred,[venta].CreditoDispo,[venta].Saldo,[venta].Fvence,[venta].SubTotal,[venta].IVA,[venta].IEPS,[venta].TOTAL,
            [venta].Cancelada, COUNT([detallevet].DescMon) AS venta_count,
              SUM(detallevet.Precio) AS sum_Precio,
              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')
       .group(:Id,:RutaId,:VendedorId,:CodCliente,:Documento,:Fecha,:TipoVta,:DiasCred,:CreditoDispo,:Saldo,:Fvence,:SubTotal,:IVA,:IEPS,:TOTAL,:Cancelada)
       .where("(venta.RutaId = :rutaId or :rutaId = '') AND (detallevet.Articulo = :articulo or :articulo = '')  AND (venta.CodCliente = :codcliente or :codcliente = '') AND (venta.IdEmpresa = :idempresa)",{rutaId: params[:search], articulo: params[:search3], codcliente: params[:search2], idempresa: params[:search6]})
       .distinct
  query = query.where('venta.Fecha >= ? AND venta.Fecha <= ?', (params[:search4].to_date).strftime('%Y-%m-%d'), (params[:search5].to_date).strftime('%Y-%m-%d')) if params[:search4].present? and params[:search5].present?
  query
   end

con esto estoy buscando todas aquellas ventas relacionadas a sus detalles. lo que quiero hacer ahora es mostrar los detalles de cada venta mediante un render. he realizado la relacion en el modelo de venta:

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

los detalles se relacionan a las ventas solamente mediante la combinacion de dos campos, que es la "RutaId" y el "Documento", estoy intentando hacer el render de esta forma:

`<% vent.detallevet.each do |d| %>
 <%= d.Articulo%>
 <% end %>`

pero me muestra este error:

 ActionView::Template::Error (TinyTds::Error: Invalid column name 'vent_id'.: EXEC sp_executesql N'SELECT [detallevet].* FROM [detallevet] WHERE [detallevet].[vent_id] = @0 AND [detallevet].[Docto] = @1 AND [detallevet].[RutaId] = @2', N'@0 int, @1 int, @2 int', @0 = 710988, @1 = 16138782, @2 = 161):

me parece que esta buscando un vent_id (vent es el singular de la tabla venta) en detallevet(mi tabla de detalle, el singular es detalleve), dicho campo vent_id no existe debido a que ambas tablas solo se relacionan mediante RutaId y Documento. como podria solucionarlo?

3
задан 28.12.2016, 17:25
0 ответов

По умолчанию, когда ты помещаешь связь между двумя подмостками, rails всегда ищи из-за одного пойдите, что я присоединил подмостки, и пойми, что у foreign key будет имя тип
"#{nombre_de_tabla_en_minuscula}_id" и что primary key будет id. В противоположном случае, ты должен определять обе стоимость. В твоем случае, который связь делает себе через два поля, ты был бы должен делать что-то как:

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

Помести глаз, в который я достал RutaId where что у тебя был внутри lambda, и я это определил как primary/foreign key.

2
ответ дан 03.12.2019, 17:57