2011-03-16 14 views
9

Tengo dos modelos, de artículos y productos de la siguiente manera:Rieles: belongs_to y has_many el uso de identificadores no estándar

irb(main):007:0> Item 
=> Item(id: integer, identification_number: string, production_date: date, 
     created_at: datetime, updated_at: datetime, going_in: boolean) 
irb(main):008:0> Product 
=> Product(id: integer, sku: string, barcode_identification: string, 
      created_at: datetime, updated_at: datetime) 

pensar en esto como un artículo es de un producto en particular.

He conseguido hacer referencia a todos los elementos de un producto en particular (Product.find (1) .items) a través de

class Product < ActiveRecord::Base 
    has_many :items, :foreign_key => "identification_number", 
        :primary_key => "barcode_identification" 
end 

pero me parece que no puede remitir el producto de una opción concreta. Esto es lo que tengo ahora:

class Item < ActiveRecord::Base 
    set_primary_key :identification_number 
    belongs_to :product, :foreign_key => "barcode_identification" 
end 

Y en cuanto a mi entender con referencia a: las bases de datos se refiere, que debería funcionar. Excepto que no. Tal vez me estoy perdiendo algo aquí? Soy bastante nuevo en los rieles (alrededor de un mes o menos)

Respuesta

15

¿Tiene que ser un belongs_to? Como está especificando la clave principal y la externa, ¿por qué no?

class Product < ActiveRecord::Base 
    has_many :items, :foreign_key => "identification_number", 
        :primary_key => "barcode_identification" 
end 

class Item < ActiveRecord::Base 
    has_one :product, :foreign_key => "barcode_identification", 
        :primary_key => "identification_number" 
end 
+1

¿Puede explicar por qué has_one funciona y belongs_to no para este escenario? Esperaría que belongs_to funcione, pero no es así. – ryanjones

+1

Interesante. Trabajó para mi. Gracias. Aún me pregunto por qué pertenece_to no funciona –

+0

@RonyVarghese 'belongs_to' debería funcionar en Item si especifica las claves externas y principales correctamente: ' belongs_to: product,: foreign_key => "número_de_identidad",: primary_key => "identificación_de_barreras" ' (tenga en cuenta que las claves son las mismas que en el 'has_many'!) Consulte los documentos para estos dos métodos para ver las distinciones sutiles: http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_one y http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/belongs_to – qix

1

Debe tener una clave externa en su tabla de elementos. Supongo que el código_identificación_de_barcador es una columna (clave externa) en la tabla de elementos. Si tiene alguna otra columna, simplemente reemplácela con eso.

Trate de esta manera:

class Product < ActiveRecord::Base 
    set_primary_key :barcode_identification 
    has_many :items, :foreign_key => "barcode_identification_id" 
end 

class Item < ActiveRecord::Base 
    set_primary_key :identification_number 
    belongs_to :product 
end 
Cuestiones relacionadas