El modelado de las relaciones entre manchas y confirmaciones ala Cuadrangular
-
21-09-2019 - |
Pregunta
Aquí está la primicia:
Como un ejercicio de aprendizaje, estoy tratando de escribir un Rieles clon de uno de los muchos juegos basados en la ubicación que hay (Foursquare, Gowalla, etc.) Tengo a los Usuarios que crean y check in a las Tiendas.
En ActiveRecord términos:
:user has_many :stores
:store belongs_to :user
Pero ahora he creado un tercer modelo, de Confirmaciones.La mesa detrás de la modelo contiene dos campos, user_id (para registro de Usuario que hizo el checkin), y store_id (para grabar lo de la Tienda que el Usuario registrado).
Una vez más, en términos de AR:
:checkin belongs_to :user
:checkin belongs_to :store
:user has_many :checkins
:store has_many :checkins
Todo esto funciona muy bien en mi Usuario y Almacenar puntos de vista, puedo llamar a @usuario.confirmaciones y @store.llegadas respectivamente.La única cosa es, de esta manera puedo recuperar solo el user_id o store_id, donde realmente quiero obtener el nombre de usuario o el nombre de la tienda.Así que me imagino el intermedio checkin tabla se presta perfectamente para un uso de :a través de:
:user has_many :stores, :through => :checkins
:store has_many :users, :through => :checkins
Esto tiene sentido, pero la cosa es que un Usuario ya has_many de Tiendas de las que ha creado!Y en su página de usuario, necesito lista de las Tiendas que ha creado Y las que él está marcado en.Todavía estoy tratando de envolver mi cabeza alrededor de has_many_and_belongs_to así que no estoy seguro si que me puso en la dirección correcta.Cualquiera cuidado para ofrecer una pista?
Solución
Rails hace que sea fácil de manejar esta situación.Una solución:el usuario puede utilizar una relación diferente nombre para el segundo conjunto de tiendas.Por ejemplo:
class Checkin
belongs_to :store
belongs_to :user
end
class Store
belongs_to :user
has_many :checkins
end
class User
has_many :stores
has_many :checkins
has_many :visited_stores, :through => :checkins, :source => :store
end
El uso de la :source
opción indica ActiveRecord para buscar la Checkin
asociación :store
cuando la construcción de la lista de los visitó las tiendas.Alternativamente, usted podría haber dicho
has_many :created_stores, :class_name => "Store"
has_many :stores, :through => :checkins
En este caso, debe cambiar el nombre de las tiendas de propiedad en lugar de la visitados.