সম্পর্কের সংজ্ঞা দেওয়ার জন্য আমি একটি টেবিলের দুটি কলাম ব্যবহার করতে সক্ষম হতে চাই। সুতরাং উদাহরণ হিসাবে একটি টাস্ক অ্যাপ্লিকেশন ব্যবহার।
চেষ্টা 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