rails links link_to link how _blank ruby-on-rails ruby activerecord arel

ruby on rails - links - Arel+Rails 4.2 causando problemas(se pierden los enlaces)



rails link to target_blank (1)

Recientemente hemos actualizado a Rails 4.2 desde Rails 4.1 y estamos viendo problemas con el uso de Arel + Activerecord porque estamos recibiendo este tipo de error:

ActiveRecord::StatementInvalid: PG::ProtocolViolation: ERROR: bind message supplies 0 parameters, but prepared statement "" requires 8

Aquí está el código que se está rompiendo:

customers = Customer.arel_table ne_subquery = ImportLog.where( importable_type: Customer.to_s, importable_id: customers[''id''], remote_type: remote_type.to_s.singularize, destination: ''hello'' ).exists.not first = Customer.where(ne_subquery).where(company_id: @company.id) second = Customer.joins(:import_logs).merge( ImportLog.where( importable_type: Customer.to_s, importable_id: customers[''id''], remote_type: remote_type.to_s.singularize, status: ''pending'', destination: ''hello'', remote_id: nil ) ).where(company_id: @company.id) Customer.from( customers.create_table_alias( first.union(second), Customer.table_name ) )

Descubrimos cómo resolver la primera parte de la consulta (que se ejecuta en el mismo error de rieles de no tener enlaces) moviendo el exists.not para estar dentro de Customer.where como esto:

ne_subquery = ImportLog.where( importable_type: Customer.to_s, importable_id: customers[''id''], destination: ''hello'' ) first = Customer.where("NOT (EXISTS (#{ne_subquery.to_sql}))").where(company_id: @company.id)

Esto pareció funcionar pero nos encontramos con el mismo problema con esta línea de código:

first.union(second)

Cada vez que ejecutamos esta parte de la consulta, los enlaces se pierden. El primero y el segundo son objetos de registro activos, pero tan pronto como los "unimos", pierden los enlaces y se convierten en objetos.

Intentamos recorrer la consulta y reemplazar manualmente los enlaces, pero no conseguimos que funcionara correctamente. ¿Qué deberíamos hacer en su lugar?

EDITAR:

También intentamos extraer los valores de enlace del primero y segundo, y luego reemplazarlos manualmente en el objeto arel de esta manera:

union.grep(Arel::Nodes::BindParam).each_with_index do |bp, i| bv = bind_values[i] bp.replace(Customer.connection.substitute_at(bv, i)) end

Sin embargo, falla porque:

NoMethodError: undefined method `replace'' for #<Arel::Nodes::BindParam:0x007f8aba6cc248>

Esta fue una solución sugerida en los rieles github repo.


Sé que esta pregunta es un poco antigua, pero el error me sonaba familiar. Tenía algunas notas y nuestra solución en un repositorio, así que pensé en compartirlas.

El error que estábamos recibiendo era:

PG :: ProtocolViolation: ERROR: el mensaje de enlace proporciona 0 parámetros, pero la declaración preparada "" requiere 1

Como puede ver, nuestra situación es un poco diferente. No teníamos 8 valores de enlace. Sin embargo, nuestro único valor de enlace todavía estaba siendo superado. Cambié el nombre de las cosas para mantenerlo general.

first_level = Blog.all_comments second_level = Comment.where(comment_id: first_level.select(:id)) third_level = Comment.where(comment_id: second_level.select(:id))

Blog.all_comments es donde tenemos el valor de enlace único. Esa es la pieza que estamos perdiendo.

union = first_level.union second_level union2 = Comment.from( Comment.arel_table.create_table_alias union, :comments ).union third_level relation = Comment.from(Comment.arel_table.create_table_alias union2, :comments)

Creamos una unión muy parecida a usted, excepto que necesitábamos unir tres consultas diferentes.

Para obtener los valores de enlace perdidos en este punto, hicimos una tarea simple. Al final, este es un caso un poco más simple que el tuyo. Sin embargo, puede ser útil.

relation.bind_values = first_level.bind_values relation

Por cierto, aquí está el problema de GitHub que encontramos al trabajar en esto. Parece que no tiene ninguna actualización ya que esta pregunta fue publicada sin embargo.