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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top