AYUDA

22 views
Skip to first unread message

josedes

unread,
Jun 26, 2017, 8:29:25 PM6/26/17
to rubysur
Hola amigos,

Nuevamente necesito de su valiosa ayuda para resolver un problema.

Tengo los siguientes modelos:

class Administradora::Owner < ApplicationRecord  #namespace administradora
 
  has_many :owner_mails, class_name: "OwnerMail"
  has_many :junta_mails, through: :owner_mails, class_name: "OwnerMail", foreign_key: :administradora_owner_id
 
end

class Junta::Mail < ApplicationRecord  #namespace junta

has_many :owner_mails, class_name: "OwnerMail"
has_many :adminstradora_owners, through: :owner_mails, class_name: "OwnerMail"

end

class OwnerMail < ApplicationRecord  #
no está en un namespace  (join table)
  belongs_to :administradora_owner, class_name: "Administradora::Owner"
  belongs_to :junta_mail, class_name: "Junta::Mail"
end

Lo que sucede es que quiero desde un objeto de Administradora::Owner pueda llegar a los registros que tiene asociados en OwnerMail, por ejemplo:
 
owner = Administradora::Owner.first

Si busco

owner.owner_mails 

Me dice:
ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR:  column owner_mails.owner_id does not exist

Reamente necesito su ayuda

José




josedes

unread,
Jun 26, 2017, 8:31:07 PM6/26/17
to rubysur

Joaquín Vicente

unread,
Jun 26, 2017, 8:42:22 PM6/26/17
to rub...@googlegroups.com
​como se llaman las tablas y cuales son los campos que usás como claves foráneas?​

--
Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+unsubscribe@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Pablo Moreira Mora

unread,
Jun 26, 2017, 8:54:31 PM6/26/17
to rub...@googlegroups.com
En el modelo owner_mail cambia el primer belongs_to

belongs_to :administradora_owner, class_name: "Administradora::Owner", forening_key: :owner_id

Enviado desde mi iPhone

Pablo Monfort

unread,
Jun 27, 2017, 6:35:10 AM6/27/17
to rub...@googlegroups.com
Tiene pinta que te esta faltando el campo owner_id en la tabla owner_mails, si lo agregas tendria que funcionar bien.

Otra cosa que no es un error pero no es necesario, estas especificando el 'class_name' pero si el key es el mismo nombre que la clase no es necesario rails lo hace automagicamente
'has_many :owner_mails, class_name: "OwnerMail"'

Saludos

--
Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+u...@googlegroups.com.

Jose De Sousa

unread,
Jun 27, 2017, 11:13:38 AM6/27/17
to rubysur
Gracias Pablo por responder,

Si hagolo que me dices, cuando por consola hago:

OwnerMail.create! con sus atributos y valores, me dice:

ActiveRecord::RecordInvalid: Validation failed: Administradora owner must exist, Junta mail must exist

Que puede estar pasando?

José

--
Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+unsubscribe@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/d/optout.



--
OtusNet ©
Soluciones inteligentes
@ sus necesidades en Internet
Joselito De Sousa
(058)-04142384634

Jose De Sousa

unread,
Jun 27, 2017, 11:17:46 AM6/27/17
to rubysur
Pablo disculpa no respondí bien,

Pero estoy colocando el campo administradora_owner_id, que sería la foranea de la tabla Administradora_owner

José


Pablo Moreira Mora

unread,
Jun 27, 2017, 11:28:05 AM6/27/17
to rub...@googlegroups.com
Perdón el error fue mi, si tú forening key es la que me decís en teoría no haría falta especificarla en la relación.

Enviado desde mi iPhone
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+u...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Pablo Monfort

unread,
Jun 27, 2017, 11:36:25 AM6/27/17
to rub...@googlegroups.com
Hola Jose,
Estas poniendo keys validos para 'Administradora::Owner' y para 'Junta::Mail' ?
Tienen que existir un administrador_owner y una junta_mail en la DB que corresponda.
El error habla de eso, si por alguna razón querés dejar alguno en nil no debería darte problemas a menos que hayas puesto una validación en el modelo.

Otro comentario independiente a la pregunta

'has_many :junta_mails, through: :owner_mails, class_name: "OwnerMail", foreign_key: :administradora_owner_id'

en esta linea no tenés porque especificar la foreign_key rails lo saca del nombre de las clases.

Saludos
Para acceder a más opciones, visita https://groups.google.com/d/optout.
 

Jose De Sousa

unread,
Jun 27, 2017, 11:44:01 AM6/27/17
to rubysur
Pablo, aprecio tu ayuda y el tiempo,

En la BD esta administradora_owner y junta_mail

Si te entiendo: el key en administradora_owner es id (idem en junta_mail), en la owner_mail es administradora_owner_id y junta_mail_id

Le quite el foreign_key al has_many .... through, y efectivamente las consultas funcionan bien,

pero el create por terminal no lo hace:

x = OwnerMail.create(administradora_owner_id: 4,junta_mail_id: 3, created_at: "2016/04/04", updated_at: "2016/04/04")
   (0.2ms)  BEGIN
   (0.5ms)  ROLLBACK

Los id 4 y 3 existen en sus respectivas tablas) y el error es:
ActiveRecord::RecordInvalid: Validation failed: Administradora owner must exist, Junta mail must exist

Agradezco tu tiempo

Jose De Sousa

unread,
Jun 27, 2017, 11:45:55 AM6/27/17
to rubysur
Gracias Pablo por tu ayuda lo aprecio,

Puedo ahora llegar de Adminitradora::Owner a la join table OwnerMail
Administradora::Owner.first.owner_mails

Pero no puedo agregar un registro en la join_table (lo hice directamente en la BD)

Mis modelos ahora esta así:
class Administradora::Owner < ApplicationRecord
   has_many :owner_mails, foreign_key: :administradora_owner_id
   has_many :junta_mails, through: :owner_mails

 end

class Junta::Mail < ApplicationRecord
 has_many :owner_mails, class_name: "OwnerMail", foreign_key: :junta_mail_id
 has_many :adminstradora_owners, through: :owner_mails
end

class OwnerMail < ApplicationRecord

 belongs_to :administradora_owner,  :foreign_key => :owner_id, :primary_key => :administradora_owner_id
  belongs_to :junta_mail,  :foreign_key => :mail_id, :primary_key => :mail_id
end

Por consola:
x = OwnerMail.create(administradora_owner_id: 4,junta_mail_id: 3, created_at: "2016/04/04", updated_at: "2016/04/04")
   (0.2ms)  BEGIN
   (0.5ms)  ROLLBACK

Los id 4 y 3 existen en sus respectivas tablas y el error es:

ActiveRecord::RecordInvalid: Validation failed: Administradora owner must exist, Junta mail must exist

Agradezco y aprecio tu ayuda


Jose De Sousa

unread,
Jun 27, 2017, 12:29:42 PM6/27/17
to rubysur
Joaquin gracias por responder y por la ayuda que me puedas dar

Las tablas son:

Administradora::Owner (administradora_owners)
Junta::Mail (junta_mails)
Ownermail (owner_mails)

Espero tu respuesta 👍

Pablo Moreira Mora

unread,
Jun 27, 2017, 12:40:31 PM6/27/17
to rub...@googlegroups.com
Podrias enviar las validaciones que tenes en el modelo ownermail?

--
Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+unsubscribe@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
Ing. Pablo F. Moreira Mora
Líder de Proyecto
Dirección de Proyectos Informáticos | UTN - FRT
skype: pablo.moreira.mora

Jose De Sousa

unread,
Jun 27, 2017, 2:50:03 PM6/27/17
to rubysur
No tengo validaciones en los modelos, solo las asociaciones, por eso menos entiendo


Emanuel Friedrich

unread,
Jun 27, 2017, 3:25:25 PM6/27/17
to rub...@googlegroups.com
En el primer belongs_to de OwnerEmail no falta foreign_key: :administradora_owner_id?

Sería útil que mostraras las tablas en bd como están.

Pablo Moreira Mora

unread,
Jun 27, 2017, 3:32:45 PM6/27/17
to rub...@googlegroups.com
Jose, lo que podria estar faltando en las relaciones es inverse_of te deja la documentacion como para que la chequees http://guides.rubyonrails.org/association_basics.html#bi-directional-associations

Jose De Sousa

unread,
Jun 27, 2017, 3:34:01 PM6/27/17
to rubysur
Hola Emanuel,

Agradecido por tu ayuda

En este momento tengo los modelos de la siguiente manera:

class Administradora::Owner < ApplicationRecord

has_many :owner_mails, class_name: "OwnerMail", foreign_key: :junta_mail_id
has_many :junta_owners, through: :owner_mails


end

class Junta::Mail < ApplicationRecord

 has_many :owner_mails
 has_many :owners, through: :owner_mails

 end

class OwnerMail < ApplicationRecord
 belongs_to :administradora_owner,  class_name: "Administradora::Owner", foreign_key: :administradora_owner_id
 belongs_to :junta_mail,  class_name: "Junta::Mail", foreign_key: :junta_mail_id
end

Me permite crear, hice:
OwnerMail.create!(administradora_owner_id: 5, junta_mail_id: 3, created_at: "2017/04/04", updated_at: "2017/04/04")
Funcionó

Pero no puedo hacer:
Administradora::Owner.find(5).owner_mails

Me dice:
2.3.1 :034 > a = Administradora::Owner.find(5).owner_mails
  Administradora::Owner Load (0.7ms)  SELECT  "administradora_owners".* FROM "administradora_owners" WHERE "administradora_owners"."id" = $1 LIMIT $2  [["id", 5], ["LIMIT", 1]]
 
OwnerMail Load (0.3ms)  SELECT "owner_mails".* FROM "owner_mails" WHERE "owner_mails"."junta_mail_id" = $1  [["junta_mail_id", 5]]
 => #<ActiveRecord::Associations::CollectionProxy []>

La asociación está vacia no trae nada del join table

En schema.rb:
 create_table "administradora_owners", force: :cascade do |t|
    t.string   "cedula"
    t.string   "nombre"
    t.string   "apellido"
    t.date     "fecha_nacimiento"
    t.string   "telefono_local"
    t.string   "celular1"
    t.string   "celular2"
    t.string   "correo"
    t.integer  "administrador_administradoras_id"
    t.datetime "created_at",                       null: false
    t.datetime "updated_at",                       null: false
    t.index ["administrador_administradoras_id"], name: "index_administradora_owners_on_administrador_administradoras_id", using: :btree
  end

  create_table "junta_mails", force: :cascade do |t|
    t.string   "asunto"
    t.string   "mensaje"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "owner_mails", force: :cascade do |t|
    t.integer  "administradora_owner_id"
    t.integer  "junta_mail_id"
    t.datetime "created_at",              null: false
    t.datetime "updated_at",              null: false
    t.index ["administradora_owner_id"], name: "index_owner_mails_on_administradora_owner_id", using: :btree
    t.index ["junta_mail_id"], name: "index_owner_mails_on_junta_mail_id", using: :btree
  end

Jose De Sousa

unread,
Jun 27, 2017, 3:54:51 PM6/27/17
to rubysur
Muchachos, de antemano gracias a todos por la ayuda, creo que lo resolví ahora tengo que reflexionar por que fallaba, por que fue casi de carambola, quedo así:

class Administradora::Owner < ApplicationRecord

 has_many :owner_mails, class_name: "OwnerMail", foreign_key: :administradora_owner_id, dependent: :destroy

has_many :junta_mails, through: :owner_mails
end

class Junta::Mail < ApplicationRecord
 has_many :owner_mails, class_name: "OwnerMail", foreign_key: :junta_mail_id, dependent: :destroy
 has_many :administradora_owners, through: :owner_mails

end

class OwnerMail < ApplicationRecord
 belongs_to :administradora_owner,  class_name: "Administradora::Owner", foreign_key: :administradora_owner_id
 belongs_to :junta_mail,  class_name: "Junta::Mail", foreign_key: :junta_mail_id
end

Así pude agregar nuevos registros a la join_table, puedo consultar de un owner los registros asociados en la join_table

Es evidente que esto desde el inicio pude resolverlo de otras maneras, pero en este momento  quería tocar nada más que los modelos para no modificar el código de otro lugar.

Gracias de nuevo

José

Emanuel Friedrich

unread,
Jun 27, 2017, 3:55:27 PM6/27/17
to rub...@googlegroups.com
Un problema menos:)

Ahora se me hace que te falta quitar el foreign_key del primer has_many de Owner o colocar el correcto :administradora_owner_id


Y el segundo has_many no entiendo. Imagino que queres hacer 
has_many :junta_mails

Perdón si le erro en algo estoy con el cel.

Cuando indicas el foreign_key en el has_many es la clave foranea que apunta a mi clave primaria en la tabla del lado many. Y le estas indicando el id del mail en vez del ID del Owner. 

Jose De Sousa

unread,
Jun 27, 2017, 4:04:44 PM6/27/17
to rubysur
Emanuel, si le quito el foreign_key a
has_many :owner_mails, foreign_key: :administradora_owner_id, dependent: :destroy

me da error:
ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR:  column owner_mails.owner_id does not exist
LINE 1: SELECT "owner_mails".* FROM "owner_mails" WHERE "owner_mails...


Emanuel Friedrich

unread,
Jun 27, 2017, 4:18:03 PM6/27/17
to rub...@googlegroups.com
Si está bien. No sabe inferir la foreign_key al parecer por el namespace. 

Que bueno q está todo ok.

Saludos

Jose De Sousa

unread,
Jun 27, 2017, 4:19:38 PM6/27/17
to rubysur
Agradecido Emanuel full desde Caracas


Reply all
Reply to author
Forward
0 new messages