Pregunta

Yo un poco confundido acerca de cómo este trabajo, incluso si funciona correctamente. Tengo un modelo que tiene dos asociación a la misma otro modelo.

Compañía tiene un propietario y la empresa tiene muchos empleados de los usuarios de clase.

aquí es mi modelo de empresa:

class Company < ActiveRecord::Base
  validates_presence_of :name

  has_many :employee, :class_name => 'User'
  has_one :owner, :class_name => 'User'
  accepts_nested_attributes_for :owner, :allow_destroy => true
end

aquí está mi modelo de usuario:

class User < ActiveRecord::Base
  include Clearance::User
  attr_accessible :lastname, :firstname #other attr are whitelisted in clearance gem
  validates_presence_of :lastname, :firstname
  belongs_to :company
end

Ahora suponiendo que tengo 3 empleados de esta compañía, incluyendo el propietario. Cuando por primera vez crear la empresa me puse el propietario para el empleado con id 1 y los otros dos (2,3) se añaden a la lista de empleados configurando sus Company_id (user.company = empresa). Los tres tienen sus Company_id definidas con el ID empresa que podemos asumir es 1

cuando pido company.owner, consigo el derecho de usuario y cuando lo haga company.employee, consigo los tres.

Si cambio de propietario para el usuario 2, que elimina el usuario 1 de los empleados de forma automática mediante el establecimiento se Company_id a cero. Esto está bien y si le añadimos la espalda como un simple empleado todo sigue siendo buena.

¿Cómo diablos rieles saben cuál es cuál? Lo que quiero decir es ¿cómo sabe que un empleado es propietario y no sólo un empleado? Nada en el esquema define esto.

Tengo la sensación de que debería invertir la asociación de propietarios y hacer empresa belong_to un usuario.

¿Fue útil?

Solución

Como lo tienes ahora, no hay nada que distinga a los propietarios de los empleados. Lo que significa que vas a tener problemas una vez que comience la eliminación de las personas o intenta cambiar la propiedad.

Como señala François, que sólo estás lucking en que el propietario es el usuario que pertenece a la empresa con el ID más bajo.

Para solucionar el problema que tendría mis modelos se relacionan de la siguiente maner.

class Company < ActiveRecord::Base
  belongs_to :owner, :class_name => "user"
  has_many :employees, :class_name => "user"
  validates_presence_of :name
  accepts_nested_attributes_for :owner, :allow_destroy => true
end

class User < ActiveRecord::Base
  include Clearance::User
  attr_accessible :lastname, :firstname #other attr are whitelisted in clearance gem
  validates_presence_of :lastname, :firstname
  belongs_to :company
  has_one :company, :foreign_key => :owner_id
end

Vas a tener que añadir otra columna llamada OWNER_ID a la mesa de Empresas, pero esto define con mayor claridad sus relaciones. Y va a evitar problemas asociados con el cambio de propietario. Tomar nota de que podría haber una dependencia cíclica si seguir este camino y que su conjunto de bases de datos de manera que tanto users.company_id y companies.owner_id no puede ser nulo.

No estoy muy seguro de lo bien accepts_nested_attributes_for jugará con una relación belongs_to.

Otros consejos

has_one es el azúcar sintáctica para:

has_many :whatevers, :limit => 1

tiene uno añade el bit :limit => 1, asegurando de esta manera solamente 1 registro se devuelve nunca. En su declaración tiene uno, asegúrese de que tiene una cláusula de :order, para devolver el registro correcto en todas las circunstancias. En este caso, me gustaría poner una bandera en el empleado para significar que es el dueño, y ordenar por esta columna para obtener el registro correcto primero.

Tu pregunta sobre cómo es que Rails sabe que esto es porque la mayoría de las bases de datos volverán registros en su orden de la clave primaria. Así, la primera añadió empleado tiene la ID 1, primero será devuelto por el mismo.

Usted podría tener un modelo llamado la propiedad -

ownership belongs_to company   
ownership belongs_to user

user has_many ownerships
company has_one ownership
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top