ruby-on-rails - relaciones - rails references
¿Cómo hacer has_many y has_one asociación en el mismo modelo? (5)
Necesito hacer dos asociaciones en el mismo modelo. Dónde:
Team has_many
User Now, quiero que Team has_one
Líder
Este "Líder" será un Usuario
Estoy tratando de usar has_one throught
pero creo que la asociación no funciona.
Leader.rb
class Leader < ActiveRecord::Base
belongs_to :user
belongs_to :team
Team.rb
class Team < ActiveRecord::Base
has_one :user, through: :leader
end
User.rb
class User < ActiveRecord::Base
belongs_to :team
has_one :captain
end
y el error de seguimiento alrededor de la línea 27:
NoMethodError in TeamsController#create
26 def create
**27 @team = current_user.teams.create(team_params)**
28 @team.save
29 respond_with(@team)
30 current_user.update(team_id: @team.id)
Team has_many User Now, quiero que Team tenga_un Líder
Este "Líder" será un Usuario
Usar herencia (también llamado subclasificación), Líder es un usuario.
class User < ActiveRecord::Base
belongs_to :team
end
class Leader < User
end
class Team < ActiveRecord::Base
has_many :users
has_one :leader
end
Tu tabla de usuarios también es importante. Asegúrese de que los usuarios tengan t.belongs_to :team
y t.string :type
su método create_table. Tenga en cuenta que un Líder es un Usuario y no necesita una tabla separada, sin embargo, debe permitir que ActiveRecord registre su tipo para que pueda devolver el Modelo correcto más adelante.
Referencias
inheritance específicamente necesita ''herencia de mesa única''
belongs_to desplácese hacia abajo para has_one y has_many, las tres relaciones utilizadas aquí.
¿Qué hay de la configuración de un indicador boolean
en la tabla de usuarios llamado leader
? Y luego tu asociación puede convertirse en:
class Team < ActiveRecord::Base
has_many :users
has_one :leader, class_name: ''User'', -> { where leader: true }
end
En este caso creo que necesitas 2 modelos son suficientes
1). Modelo de usuario
class User < ActiveRecord::Base
belongs_to :team
end
2). Modelo de equipo
class Team < ActiveRecord::Base
has_many :users
belongs_to :leader, class_name: ''User'', foreign_key: :leader_id
end
Tienes has_one
asociación entre el user
y el team
. Prueba esto:
current_user.create_team(team_params)
Además, debe agregar una adecuada asociación de respaldo de team
a leader
.
class Team < ActiveRecord::Base
belongs_to :leader
has_one :user, through: :leader
end
current_user.teams.create(team_params)
Equipos es para una asociación has_many
, quieres current_user.create_team(team_params)