¿Cuál es la mejor manera de configurar mis tablas y las relaciones de este caso de uso?
-
02-10-2019 - |
Pregunta
1) Un usuario puede tener muchas causas y una de las causas puede pertenecer a muchos usuarios.
2) Un usuario puede tener muchas campañas y campañas puede pertenecer a muchos usuarios. Campañas pertenecen a una sola causa.
Quiero ser capaz de asignar causas o campañas para un usuario determinado, de forma individual. Así, un usuario se le puede asignar una campaña específica. O un usuario podría asignar una causa y todas las campañas de esa causa, entonces debe estar asociado con un usuario.
¿Es posible? Y podría configurarlo de manera que las relaciones podrían simplificarse así:
User.causes = todas las causas que pertenecen a un usuario
User.campaigns = todas las campañas que pertenecen al usuario ya sea a través de una relación de causa o campaña asociación
Solución
Creo que debe utilizar lo siguiente:
class User < ActiveRecord::Base
has_and_belongs_to_many :causes
has_and_belongs_to_many :campaigns
end
class Cause < ActiveRecord::Base
has_and_belongs_to_many :users
has_many :campaigns
end
class Campaign < ActiveRecord::Base
has_and_belongs_to_many :users
belongs_to :cause
end
De esta manera puede utilizar
User.causes
User.campaigns
Cause.campaing
Cause.users
Campaign.users
Campaign.cause
aquí relación sobre has_and_belongs_to_many
, aquí sobre has_one
y aquí sobre belongs_to
.
Avísame si esto es lo que quiere:]
Editar
"Yo seguiría siendo necesario User.campaigns a ser campañas de causas de un usuario o campañas individuales asociados con una usuario "
Puede tener un método en usuarios modelo que devuelve todas las campañas. Algo como esto:
def all_campaigns
self.campaigns + self.causes.collect{ |c| c.campaigns }
end
Otros consejos
Esto debería funcionar.
class User < ActiveRecord::Base
has_many :causes, :through => :cause_users
has_many :campaigns, :through => :campaign_users
# other model stuff
class Cause < ActiveRecord::Base
has_many :users, :through => :cause_users
has-many :campaigns
# other model stuff
class Campaign < ActiveRecord::Base
belongs_to :cause
has_many :users, :through => :campaign_users
# other model stuff
class CampaignUser < ActiveRecord::Base
belongs_to :campaign
belongs_to :user
# other model stuff
class CauseUser < ActiveRecord::Base
belongs_to :cause
belongs_to :user
# other model stuff
has_many: a través requiere la creación de un nuevo modelo para cada uno de éstos se une a:. Campaign_users y cause_users, como se muestra, sino que proporciona una mayor funcionalidad más tarde de lo has_and_belongs_to_many
También sugeriría el uso de mejores nombres que: campaign_users y cause_users: por lo que la relación es más significativa.
Usted puede hacer: has_many: a través de asociaciones entre los usuarios y las campañas que utilizan una combinación de modelos, y también entre los usuarios y las causas utilizando el modelo de unirse a otra. El puede hacer una: asociación de campañas en el modelo de causas, poniendo una:: has_many belongs_to:. Causa en el modelo de campaña
Sin embargo, usted no será capaz de obtener todos los usuarios campañas o causas por User.campaigns.orders o User.order.campaigns. Usted debe hacer una iteración sobre la colección o User.causes User.campaigns, ir a buscar Campaign.cause o Cause.capaigns. O incluso hacer una consulta SQL personalizada, utilizando uniones y condiciones a la información de filtro en las uniones.