through rails many how has_and_belongs_to_many has foreign example create belongs and active ruby-on-rails activerecord

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