आप इस सरणी के बारे में रेल को जागरूक नहीं कर पाएंगे और इसका उपयोग संघों के लिए नहीं कर पाएंगे।
लेकिन यदि आप उपयोगकर्ताओं को सौंपे गए कार्यों की त्वरित खोज/फ़िल्टरिंग करना चाहते हैं तो आप कार्य ऑब्जेक्ट में उपयोगकर्ता आईडी की एक सरणी रख सकते हैं। अन्यथा, आपको अपनी मानक संबद्धता तालिका में ऐलिस को सौंपे गए सभी कार्यों को खोजने के लिए एक जॉइन करना होगा।
तो समाधान यह है कि एसोसिएशन तालिका को बनाए रखा जाए, लेकिन टास्क ऑब्जेक्ट में असाइनी यूजर आईडी को भी डुप्लिकेट किया जाए और तेजी से खोज/फ़िल्टरिंग के लिए उस आईडी सूची का उपयोग किया जाए।
आपको after_create
. से जुड़ना होगा और after_destroy
असाइनी ऑब्जेक्ट्स के लिए जीवनचक्र और टास्क रिकॉर्ड ऐरे में नई असाइनी आईडी डालें। और फिर जब किसी कार्य से एक असाइनी को हटा दिया जाता है तो आईडी को हटाने के लिए सरणी को अपडेट करें।
सभी ऐरे ऑपरेटरों के लिए पोस्टग्रेज डॉक्स देखें:
कुछ इस तरह:
class Task < ActiveRecord::Base
has_many :assignees, :dependent => :destroy
end
class Asignee < ActiveRecord::Base
belongs_to :task
after_create :insert_task_assignee
after_destroy :remove_task_assignee
# assumes that there is a column called assignee_id
# that contains the User ID of the assigned person
private
def insert_task_assignee
# TODO: check for duplicates here - before we naively push it on?
task.assignee_list = task.assignee_list.push(assignee_id)
task.assignee_list.save
end
def remove_task_assignee
id_list = task.assignee_list
id_list.reject! { |candidate_id| candidate_id == assignee_id }
task.assignee_list = id_list
task.assignee_list.save
end
end
# find all tasks that have been assigned Alice & Bob
# this will require the `postgres_ext` gem for Ruby / Postgres array searching
tasks = Task.where.contains(:assignee_list => [alice.id, bob.id]).all