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.ownercuál devuelve el usuario uno y Task.first.assigneecuál devuelve el usuario dos pero User.first.taskno 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.tasksy 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