मैं एक रिश्ते को परिभाषित करने के लिए एक मेज पर दो कॉलम का उपयोग करने में सक्षम होना चाहता हूं। इसलिए एक उदाहरण के रूप में एक कार्य ऐप का उपयोग करना।
प्रयास 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
तो फिर Task.create(owner_id:1, assignee_id: 2)
यह मुझे प्रदर्शन करने की अनुमति देता है Task.first.owner
जो उपयोगकर्ता को एकTask.first.assignee
रिटर्न देता है और जो उपयोगकर्ता को दोUser.first.task
रिटर्न देता है लेकिन कुछ भी नहीं लौटाता है। ऐसा इसलिए है क्योंकि कार्य उपयोगकर्ता से संबंधित नहीं है, वे स्वामी और असाइनमेंट से संबंधित हैं । इसलिए,
प्रयास 2:
class User < ActiveRecord::Base
has_many :tasks, foreign_key: [:owner_id, :assignee_id]
end
class Task < ActiveRecord::Base
belongs_to :user
end
यह सिर्फ दो विदेशी कुंजी के रूप में समर्थित होने के लिए नहीं लगता है कि पूरी तरह से विफल रहता है।
इसलिए मैं जो चाहता हूं, वह User.tasks
दोनों उपयोगकर्ताओं के स्वामित्व और असाइन किए गए कार्यों को कहने और प्राप्त करने में सक्षम होना चाहिए ।
मूल रूप से किसी भी तरह एक रिश्ता है कि एक क्वेरी के बराबर होगा Task.where(owner_id || assignee_id == 1)
क्या यह संभव है?
अपडेट करें
मैं उपयोग नहीं finder_sql
करना चाह रहा हूं , लेकिन इस मुद्दे का अस्वीकार्य जवाब मुझे जो चाहिए, उसके करीब लग रहा है: रेल - एकाधिक सूचकांक कुंजी प्रबंधन
तो यह तरीका इस तरह दिखेगा,
प्रयास 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
हालाँकि मुझे इसमें काम करने के लिए मिल सकता है Rails 4
, फिर भी मुझे निम्न त्रुटि मिलती रहती है :
ActiveRecord::PreparedStatementInvalid: missing value for :owner_id in :donor_id => :person_id OR assignee_id => :person_id