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

¿Fue útil?

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.

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