Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails belongs_to with custom column name

I'm working with a legacy database that gives the following schema for the tables product and familia_producto (rake db:schema:dump)

create_table "producto", primary_key: "barcode", force: true do |t|   t.string  "codigo_corto",         limit: 16,               null: false   t.string  "marca",                limit: 35   t.string  "descripcion",          limit: 50   t.string  "contenido",            limit: 10   t.string  "unidad",               limit: 10   t.float   "stock",                           default: 0.0   t.float   "precio"   t.float   "precio_neto"   t.float   "costo_promedio"   t.float   "fifo"   t.float   "vendidos"   t.boolean "aplica_iva"   t.integer "otros_impuestos",      limit: 2   t.integer "familia",              limit: 2,  default: 1,   null: false   t.integer "id_tipo_producto",     limit: 2,                null: false   t.boolean "es_perecible"   t.float   "dias_stock",                      default: 1.0   t.float   "margen_promedio",                 default: 0.0   t.boolean "es_venta_fraccionada"   t.float   "stock_pro",                       default: 0.0   t.float   "tasa_canje",                      default: 1.0   t.float   "precio_mayor"   t.float   "cantidad_mayor"   t.boolean "es_mayorista"   t.boolean "estado"   t.boolean "precio_editable" end  create_table "familia_producto", force: true do |t|   t.string "nombre", limit: 32, null: false end 

In the models I've this

class FamiliaProducto < ActiveRecord::Base   self.table_name = 'familia_producto'   has_many :productos, :class_name => 'Producto', :primary_key => 'barcode', :foreign_key => 'familia' end  class Producto < ActiveRecord::Base   self.table_name = 'producto'   belongs_to :familia_producto, :class_name => 'FamiliaProducto' end 

But when I call the .familia the producto object throws me a number, not the FamiliaProducto object.

2.1.0 :012 >   p = Producto.all[0]   Producto Load (1.7ms)  SELECT "producto".* FROM "producto"   => #<Product...... 2.1.0 :013 > p.familia   => 2  

That 2 should be the FamiliaProducto object.

like image 843
mariowise Avatar asked Jul 30 '14 22:07

mariowise


1 Answers

You must use the name of the association, also need to add the foreign key to the belongs_to

# Returns a FamiliaProducto object p = Producto.first p.familia_producto  # Producto model belongs_to :familia_producto, class_name: 'FamiliaProducto', foreign_key: 'familia'  # FamiliaProducto model has_many :productos, class_name: 'Producto', foreign_key: 'familia'  # Returns an integer p = Producto.first p.familia 
like image 186
Eyeslandic Avatar answered Sep 21 '22 19:09

Eyeslandic