Esto es lo que estoy tratando de lograr:¿Cómo comprobar si existe un registro antes de crear uno nuevo en rails3?
- que tienen un sistema de etiquetado en su lugar.
- etiquetas se crean, cuando se crean mensajes (mensajes has_many: etiquetas,: a través de =>: tag_joins
- Una etiqueta de unión se crea automáticamente cuando se crea un post con las etiquetas.).
Quiero comprobar si la etiqueta ya existe. Si lo hace, quiero usar la etiqueta existente para el registro tag_join, en lugar de crear un nuevo registro de etiqueta.
Aquí está mi código actual, que no está funcionando.
class Tag < ActiveRecord :: Base
belongs_to :user
belongs_to :tag_join
belongs_to :post
before_create :check_exists
def check_exists
tag = Tag.where(:name => self.name, :user_id => current_user.id)
if tag.nil?
tag = Tag.create(:name => self.name, :user_id => current_user.id)
end
end
end
Esto no funciona sin embargo, estoy recibiendo un error en la creación de tareas ... (el servidor es en realidad el tiempo de espera - no recibo un error específico).
¿Alguna idea?
Tokland dijo que estaba creando un bucle infinito contando para crear la etiqueta de nuevo - por lo que intentó esto:
def check_exists
tag = Tag.find_by_name_and_user_id(:name => self.name, :user_id => current_user.id)
if tag != nil
self.id = tag.id
end
end
y aún así obtener el tiempo de espera del servidor
Editar: No estoy seguro de si esto importa, pero la forma en que se agregan las etiquetas es similar a "http://railscasts.com/episodes/73-complex-forms-part-1
están anidados en el formulario de publicación y usan algo de esta manera:
def tag_attributes=(tag_attributes)
tag_attributes.each do |attributes|
tags.build(attributes)
end
end
Me pregunto si esto está impidiendo que todo funcione. Además, el uso current_user.id en el modelo sin duda parece ser un problema ...
EDIT:
Algo que he descubierto: esto tenía que cambiar, el formato que estábamos usando antes era incorrecto sintaxis: generalmente se usa para un método .where.
def check_exists
@tag = Tag.find_by_name_and_user_id(self.name, self.user_id)
if @tag != nil
#return false
#[email protected]
end
end
El problema ahora es este, puedo saber si la etiqueta ya existe. ¿Pero entonces, qué? Si voy con la opción de devolución falsa, hay un error al crear el mensaje, y el registro de combinación no se crea ... La otra opción "self = @ tag" obviamente no funciona.
Tiempo de revisión de código: Cuando se nombran rutinas, desea usar un nombre que sea indicativo de lo que hace. Llamar a un método "check_exists" cuando en realidad podría estar creando registros podría hacer que sea más difícil encontrar "de dónde vino ese registro". una vez que tienes un montón de código en una aplicación. Tal vez "get_tag" o "find_or_create_tag" sería mejor? Este tipo de cosas sutiles se suman en una aplicación y determinan su legibilidad y mantenibilidad a lo largo del tiempo. –
El tiempo de espera del servidor probablemente no esté relacionado con el código. Verifique si realmente se está ejecutando y, si está en otra máquina, si tiene conectividad. –
Realmente está sucediendo en mi entorno local. El servidor se congela cada vez que intento crear una etiqueta incluso manualmente a través del administrador de rieles. – Elliot