Quiero poder usar dos columnas en una tabla para definir una relación. Entonces, usando una aplicación de tareas como ejemplo.
Intento 1:
class User < ActiveRecord::Base
has_many :tasks
end
class Task < ActiveRecord::Base
belongs_to :owner, class_name: "User", foreign_key: "owner_id"
belongs_to :assignee, class_name: "User", foreign_key: "assignee_id"
end
Por lo que entonces Task.create(owner_id:1, assignee_id: 2)
Esto me permite realizar Task.first.owner
cuál devuelve el usuario uno y Task.first.assignee
cuál devuelve el usuario dos pero User.first.task
no devuelve nada. Lo cual se debe a que la tarea no pertenece a un usuario, pertenece al propietario y al cesionario . Entonces,
Intento 2:
class User < ActiveRecord::Base
has_many :tasks, foreign_key: [:owner_id, :assignee_id]
end
class Task < ActiveRecord::Base
belongs_to :user
end
Eso simplemente falla por completo ya que dos claves externas no parecen ser compatibles.
Entonces, lo que quiero es poder decir User.tasks
y obtener tanto las tareas asignadas como las propias de los usuarios.
Básicamente, construye de alguna manera una relación que equivaldría a una consulta de Task.where(owner_id || assignee_id == 1)
¿Es eso posible?
Actualizar
No estoy buscando usar finder_sql
, pero la respuesta no aceptada de este problema parece estar cerca de lo que quiero: Rails - Asociación de claves de índice múltiple
Entonces, este método se vería así,
Intento 3:
class Task < ActiveRecord::Base
def self.by_person(person)
where("assignee_id => :person_id OR owner_id => :person_id", :person_id => person.id
end
end
class Person < ActiveRecord::Base
def tasks
Task.by_person(self)
end
end
Aunque puedo hacer que funcione Rails 4
, sigo recibiendo el siguiente error:
ActiveRecord::PreparedStatementInvalid: missing value for :owner_id in :donor_id => :person_id OR assignee_id => :person_id