Supongamos que tenemos un sitio de fotografía. Cualquier autor puede suscribirse para recibir actualizaciones de cualquier otro autor. Obviamente, si el autor está suscrito a un autor que B no significa que B está suscrito a A. Así construimos modelos¿Cómo crear relaciones "a dos lados" de muchos a muchos en Rails?
class Author < ActiveRecord::Base
has_many :subscriptions
has_many :subscribed_by_author, :through => :subscriptions, :source => :subscribed_to
end
class Subscription < ActiveRecord::Base
belongs_to :author
belongs_to :subscribed_to, :class_name => "Author", :foreign_key => "subscribed_to"
end
De esta manera podemos utilizar
- some_author.subscribed_by_author - la lista de los autores a los que some_author está suscrito.
- Para cualquier suscripción que podemos conocer ambos extremos (que se ha suscrito a quién)
Pero la cuestión es cómo conseguir que la lista de personas suscritas a algún autor utilizando sólo los carriles (no utilizando SQL normal), es decir get la respuesta a: "¿Quién está suscrito a some_author?"
Pregunta: ¿hay alguna posibilidad en Rails de que la relación funcione en ambos lados, es decir, no solo escribiendo some_author.subscribed_BY_author
sino teniendo some_author_subscribed_TO_author
? Si hay uno, ¿entonces qué es?
P.S. solución obvia es
- cambiar el diseño de base de datos, añadiendo una columna denominada "dirección"
- crear 2 registra cada vez que se crea una suscripción
Añadir al modelo autor
has_many: subscribed_BY_author ,: a través =>: suscripciones,: fuente =>: suscrito_ a,: condiciones => "dirección = 'por'"
has_many: suscrito_TO_author,: a través =>: suscripciones,: fuente =>: suscrito_ a,: condición iones => "dirección = 'a'"
pero me pregunto si hay una solución sin cambiar el diseño de la base de datos.
Desafortunadamente no lo hizo.Pero me dio la dirección correcta y el siguiente código funcionó #Autor modelo has_many: subscriptions_to,: class_name => "Subscription",: foreign_key => "subscribed_to" has_many: subscribed_to_author,: through =>: subscriptions_to,: source =>: autor Así que acepto esta respuesta, pero primero tiene que editarla para ser correcta :) ¡Gracias! –
Siempre es un gran placer arreglar mis aswers :) – klew