Cómo organizar esta tabla para que sea accesible según el tipo de objeto que accede a ella

introduzca la descripción de la imagen aquí

Tengo esta tabla que contiene un campo llamado ‘icon_for’ que he estado usando para verificar si el icono se puede usar para un ‘Usuario’ o un ‘Saludo’.

Obviamente, esta no es la mejor manera de hacerlo, ya que si quisiera usar un ícono para decir un “Saludo” y un “Usuario” o incluso algún otro objeto, me quedaría atascado.

¿Debo crear otra tabla llamada icons_object y luego listar el icon_id y object_name? Parece que tendría que hacer muchas repeticiones de los icon_id si se usa un icono para varios objetos, pero ¿es este el camino a seguir?

También cuál sería esta asociación de tablas en Rails. Digamos que la tabla se llama icons_objects. Entonces en Rails sería

Icon.rb

icon has_many: icon_objects ?????

Totalmente confundido aquí por lo que cualquier ayuda para un NOOB sería apreciada.

¿Hay alguna manera de hacer esto normalizado?

Quieres utilizar asociaciones polimórficas. Por ejemplo:

class Icon < ActiveRecord::Base belongs_to :iconable, :polymorphic => true end class Greeting < ActiveRecord::Base has_many :icons, :as => :iconable end class User < ActiveRecord::Base has_many :icons, :as => :iconable end 

A continuación, puede obtener icons de saludos o usuarios:

 @user.icons @greeting.icons @icon.iconable #returns the parent type. 

O si desea consultar los icons para un tipo particular:

 Icon.where(:iconable_type => "greeting") 

Este enfoque no es diferente al que ya ha tomado. Los beneficios de hacer este método es que puede obtener el objeto principal sin preocuparse por qué tipo es, como lo haría si intentara implementar la otra respuesta en este hilo.

Solo necesitará ejecutar algunas migraciones para que todo funcione correctamente. Puede ver más información en http://guides.rubyonrails.org/association_basics.html#polymorphic-associations .

Editar por comentario:

Estrictamente hablando, tienes razón. No puede tener un registro polimórfico que apunte a un usuario y un saludo. Sin embargo, puede hacer un pequeño cambio y crear otro modelo, que actuaría como una tabla de unión.

 class IconConnection < ActiveRecord::Base belongs_to :inconable, :polymorphic => true belongs_to :icon end class Icon < ActiveRecord::Base has_many :icon_connections end class Greeting < ActiveRecord::Base has_many :icon_connections, :as => :iconable has_many :icons, :through => :icon_connections end class User < ActiveRecord::Base has_many :icon_connections, :as => :iconable has_many :icons, :through => :icon_connections end 

Cada IconConnection apuntaría a un saludo o un usuario, y cada una de las IconConnections apuntaría al mismo icono.

Esta configuración asume que puede tener múltiples íconos para cada usuario y saludo, pero si no, puede reemplazar los has_many ‘s con has_one ‘ s

Parece que estás hablando de una relación de muchos a muchos. Como en los icons, puede pertenecer a más de un objeto y un objeto puede tener más de un icono. Necesitas una tabla coincidente para ese tipo de relación … algo como los icon_objects de los que hablas. Luego, tus modelos has_and_belongs_to_many ya sea has_many :through relación o has_and_belongs_to_many . Si icon_objects solo existe para asignar objetos a icons, es probable que desee utilizar has_and_belongs_to_many . Si cree que necesitará almacenar información adicional sobre una relación de icons específica con un objeto específico, entonces podría necesitar un modelo real de IconObject y debería usar has_many :through la IconObject icons a objetos.

Si un objeto solo puede tener un icono , coloque la clave externa en cada una de las tablas de objetos (de modo que los users tengan un campo icon_id y también la tabla de greetings ). Luego, el usuario y el saludo tendrán una relación con el icono, y el icono tendrá una relación has_many con el usuario y el saludo.