অ্যাক্টিভেকর্ড, has_many: মাধ্যমে এবং পলিমারফিক অ্যাসোসিয়েশন


117

ভাবেন,

আমি এটি সঠিকভাবে বুঝতে পেরেছি তা নিশ্চিত করতে চাই। এবং দয়া করে উত্তরাধিকারের জন্য কেসটিকে এখানে (সেন্টেন্টবিং) উপেক্ষা করুন, পরিবর্তে has_many এর পলিমারফিক মডেলগুলিতে মনোনিবেশ করার চেষ্টা করছেন: সম্পর্কের মাধ্যমে। এটি বলেছিল, নিম্নলিখিতগুলি বিবেচনা করুন ...

class Widget < ActiveRecord::Base
  has_many :widget_groupings

  has_many :people, :through => :widget_groupings, :source => :person, :conditions => "widget_groupings.grouper_type = 'Person'"
  has_many :aliens, :through => :widget_groupings, :source => :alien, :conditions => "video_groupings.grouper_type = 'Alien'"
end

class Person < ActiveRecord::Base
  has_many :widget_groupings, :as => grouper
  has_many :widgets, :through => :widget_groupings
end

class Alien < ActiveRecord::Base
  has_many :widget_groupings, :as => grouper
  has_many :widgets, :through => :widget_groupings  
end

class WidgetGrouping < ActiveRecord::Base
  belongs_to :widget
  belongs_to :grouper, :polymorphic => true
end

নিখুঁত বিশ্বে, আমি একটি উইজেট এবং একজন ব্যক্তিকে দেওয়া চাই, এর মতো কিছু করুন:

widget.people << my_person

যাইহোক, আমি যখন এটি করি, আমি লক্ষ্য করেছি যে 'গ্রেপার'-এর' টাইপ 'উইজেট_গোষ্ঠীগুলিতে সর্বদা শূন্য থাকে। তবে আমি যদি নীচের মতো কিছু করি:

widget.widget_groupings << WidgetGrouping.new({:widget => self, :person => my_person}) 

তারপরে সমস্ত কাজগুলি যেমন আমি প্রত্যাশা করতাম। আমি মনে করি না যে আমি কখনও কখনও অ বহু-বহুজনিত সংঘের সাথে এটি ঘটতে দেখেছি এবং কেবলমাত্র জানতে চেয়েছিলাম যে এটি এই ব্যবহারের ক্ষেত্রে সুনির্দিষ্ট কিছু ছিল বা আমি সম্ভবত কোনও ত্রুটি দেখছি।

কোন সাহায্যের জন্য ধন্যবাদ!

উত্তর:


162

Ails.১.১.২ এর সাথে একটি কার্যকর সমস্যা রয়েছে যা এই কার্যকারিতাটি ভেঙে দেয়। আপনি যদি প্রথমে আপগ্রেড করার চেষ্টা করে থাকেন তবে এটি ৩.১.২ এ স্থির করা হয়েছে

তুমি খুব কাছে সমস্যাটি হ'ল আপনি: উত্স বিকল্পটি অপব্যবহার করছেন। : উত্সটি পলিমারফিক সম্পর্কিত_ সম্পর্কের দিকে নির্দেশ করা উচিত points তারপরে আপনার যা যা করা দরকার তা হ'ল নির্দিষ্ট করা: উত্স_ টাইপের যে সম্পর্কের জন্য আপনি সংজ্ঞা দেওয়ার চেষ্টা করছেন।

উইজেট মডেলটিতে এই ঠিকানার ফলে আপনি যা খুঁজছেন ঠিক সেইভাবেই করতে দেওয়া উচিত।

class Widget < ActiveRecord::Base
  has_many :widget_groupings

  has_many :people, :through => :widget_groupings, :source => :grouper, :source_type => 'Person'
  has_many :aliens, :through => :widget_groupings, :source => :grouper, :source_type => 'Alien'
end

ওহে আমার godশ্বর যে এতটা বেদনাদায়ক স্পষ্ট আমি বিশ্বাস করতে পারি না আমি ঠিক তার উপরে চকচকে হয়েছি। ধন্যবাদ এমএফআই!
কোরি

কোনও সমস্যা নেই, আমি মনে করি যে প্রথমবার এটির মুখোমুখি হওয়ার পরে কীভাবে এটি করা যায় সে সম্পর্কে আমি প্রায় একদিন ব্যাকুল হয়েছি। সাহায্য করিনি যে এটি প্রথম জিনিসগুলির মধ্যে আমি কারাগারে চেষ্টা করেছিলাম যা কোনও টিউটোরিয়াল / বই অনুসরণ করার সাথে জড়িত না।
EmFi

1
স্কটকএফ হিসাবে উল্লেখ করেছে যে, অ্যাক্টিভেকর্ড 3.1.1 এ একটি রিগ্রেশন রয়েছে যা এই আচরণকে অবরুদ্ধ করে। 3.1.2 এ আপগ্রেড করার ফলে এই সমাধানটি কার্যকর হতে পারে।
EmFi

6
@ শট্রিলিক যা উল্লেখ করেছেন একই জিনিস। উত্স_প্রকারটি নির্দিষ্ট না করার কোনও উপায় আছে, তাই আপনার মিশ্র ফলাফল রয়েছে? যদি কেউ এই সমাধান করে তবে কীভাবে তা জানতে আগ্রহী।
দামন আও

3
এখনও কারা 4.2.0 হিসাবে কাজ করে। তবে, সোর্স_ টাইপ এবং দুটি পৃথক সমিতি ব্যতীত এই দিনগুলি সম্পাদন করার কোনও উপায় আছে কি?
এমেকা

3

উপরে উল্লিখিত হিসাবে, এটি ত্রুটির কারণে 3.1.1 রেলের সাথে কাজ করে না: উত্স, তবে এটি রেলগুলিতে স্থির হয়েছে 3.1.2


-4

অনেকগুলি রয়েছে: মাধ্যমে এবং পলিমারফিক একসাথে কাজ করে না। আপনি যদি এগুলি সরাসরি অ্যাক্সেস করার চেষ্টা করেন তবে এটিতে একটি ত্রুটি ছুঁড়ে দেওয়া উচিত। যদি আমার ভুল না হয় তবে আপনাকে উইজেট.পিয়ল এবং পুশ রুটিন লিখতে হবে।

আমি মনে করি না এটি একটি বাগ, এটি এমন কিছু যা এখনও কার্যকর হয়নি implemented আমি কল্পনা করব আমরা এটি বৈশিষ্ট্যটিতে দেখছি, কারণ প্রত্যেকের একটি কেস রয়েছে যাতে তারা এটি ব্যবহার করতে পারে।


6
তারা একসাথে কাজ করে। উদাহরণস্বরূপ: has_many: সাবস্ক্রিপশন,: হিসাবে =>: সাবস্ক্রাইব has_many: গ্রাহক,: মাধ্যমে =>: সাবস্ক্রিপশন,: উত্স =>: ব্যবহারকারী
স্কটজে

আমি আমার ব্যর্থ কোডের উদাহরণ অদূর ভবিষ্যতে একটি পৃথক পোস্ট হিসাবে উপস্থাপন করব :) এই ত্রুটিটি কীভাবে বাইপাস করা যায় তা নির্ধারণের জন্য এটি আমার প্রচুর মাথাব্যাথা বাঁচাতে পারে।
সিজিআর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.