references rails inverse_of has_many has_and_belongs_to_many foreign belong association ruby-on-rails activerecord foreign-key-relationship has-many belongs-to

ruby-on-rails - inverse_of - rails references



Rieles: búsqueda de claves externas sin identificación ActiveRecord (3)

Quiero que ActiveRecord busque por una columna que no sea de identificación de una tabla. Espero que esto quede claro cuando te dé mi código de muestra.

class CoachClass < ActiveRecord::Base belongs_to :coach end class Coach < ActiveRecord::Base has_many :coach_classes, :foreign_key => ''user_name'' end

Cuando hago un coach_obj.coach_classes , esto correctamente desencadena

SELECT * FROM `coach_classes` WHERE (`coach_classes`.user_name = 2)

(2 es la id ese entrenador aquí, que es mi problema)

Quiero que se active

SELECT * FROM `coach_classes` WHERE (`coach_classes`.user_name = ''David'')

(''David'' es el nombre de user_name ese entrenador)

user_name es único y está presente en ambas tablas.

No quiero tener un coach_id en mi tabla coach_classes por algún motivo.


Creo que también debe especificar las opciones de clave principal en las asociaciones:

class CoachClass < ActiveRecord::Base belongs_to :coach, :foreign_key => ''user_name'', :primary_key => ''user_name'' end class Coach < ActiveRecord::Base has_many :coach_classes, :foreign_key => ''user_name'', :primary_key => ''user_name'' end

Esto especifica el método que devuelve la clave principal del objeto asociado (valor predeterminado para id ).


Hay una opción llamada primary_key que está establecida por defecto en :id . Desea usar:

has_many :coach_classes, :foreign_key => :user_name, :primary_key => :user_name

También use estas opciones en la asociación belongs_to .

Lea más en la documentation .


Necesitas usar finder_sql :

class Coach < ActiveRecord::Base has_many :coach_classes, :finder_sql => ''SELECT * FROM `coach_classes` WHERE (`coach_classes`.user_name = "#{user_name}")'' end