ruby-on-rails - many - rails foreign key
Modelo de rieles que tiene ''has_one'' y ''has_many'' pero con algunas restricciones (2)
Estoy mapeando 2 modelos:
User
Account
class Account
has_many :users
class User
has_one :account
La tabla de usuario como el ID de cuenta en ella.
Ahora, en el modelo de cuenta, quiero crear un "usuario principal" que una cuenta solo tiene 1 apagado. La tabla de usuario tiene un indicador booleano: is_primary, ¿cómo puedo crear un has_one en el lado de la cuenta para un usuario que tiene el is_primary y account_id mapeados?
Entonces el SQL se vería así:
SELECT * FROM users where account_id=123 and is_primary = 1
Entonces yo quiero:
Un usuario tiene una cuenta. Una cuenta tiene muchos usuarios y también tiene un único usuario principal.
Probablemente sería más sencillo agregar un campo primary_user_id a la cuenta y agregar una asociación ''has_one'' para el primary_user:
class Account
has_many :users
has_one :primary_user, :class_name => "User"
end
class User
has_one :account
end
Si debe usar el esquema existente (con el indicador booleano: is_primary), puede agregar un ámbito como este:
class User
has_one :account
scope :primary, where(:is_primary => true)
end
y luego encadena el alcance a la búsqueda de usuarios:
account = Account.find(1)
primary_user = account.users.primary.first
Enfoque 1 - Añadir una nueva asociación
Agregue una asociación has_one
con una where
lambda. Esto le permite trabajar dentro de su esquema actual.
class Account
has_many :users
has_one :primary_user, -> { where(is_primary: true) }, :class_name=> "User"
end
Ahora:
account.users #returns all users associated with the account
account.primary_user #returns the primary user associated with the account
# creates a user with is_primary set to true
account.build_primary_user(name: ''foo bar'', email: ''[email protected]'')
Enfoque 2 - Añadir un método de asociación
class Account
has_many :users do
def primary
where(:is_primary => true).first
end
end
end
Ahora:
account.users.primary # returns the primary account