সমিতির মাধ্যমে_ সম্পর্কিত


141

নিম্নলিখিত সমিতিগুলি দেওয়া, আমি মডেল থেকে সংযুক্ত করা হয়েছে Questionযে একটি রেফারেন্স প্রয়োজন । আমি এই ক্রিয়াটি সম্পাদন করতে ব্যবহার করার চেষ্টা করছি ।ChoiceChoicebelongs_to :question, through: :answer

class User
  has_many :questions
  has_many :choices
end

class Question
  belongs_to :user
  has_many :answers
  has_one :choice, :through => :answer
end

class Answer
  belongs_to :question
end

class Choice
  belongs_to :user
  belongs_to :answer
  belongs_to :question, :through => :answer

  validates_uniqueness_of :answer_id, :scope => [ :question_id, :user_id ]
end

আমি পাচ্ছি

নামআরর অবিশ্বাস্য ধ্রুবক User::Choice

যখন আমি করার চেষ্টা করি current_user.choices

এটি ভাল কাজ করে, যদি আমি অন্তর্ভুক্ত না করি

belongs_to :question, :through => :answer

তবে আমি এটি ব্যবহার করতে চাই কারণ আমি এটি করতে সক্ষম হতে চাই validates_uniqueness_of

আমি সম্ভবত সাধারণ কিছু উপেক্ষা করছি। কোন সাহায্য প্রশংসা করা হবে।


1
সম্ভবত এটি প্রতিনিধিটির স্বীকৃত উত্তরটি পরিবর্তনযোগ্য?
23inhouse

উত্তর:


60

একটি belongs_toসমিতির :throughবিকল্প থাকতে পারে না । আপনি ক্যাশে question_idচালিয়ে Choiceযাওয়ার পক্ষে এবং টেবিলটিতে একটি অনন্য সূচক যুক্ত করা ভাল (বিশেষত কারণ validates_uniqueness_ofবর্ণের অবস্থার কারণ হিসাবে)।

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


ধন্যবাদ স্টিফেন, আমি সত্যিই প্রশ্ন_আইডির সাথে সরাসরি যুক্ত হতে চাইনি, তবে আমি এটির সবচেয়ে সহজ উপায় অনুমান করি। আমার আসল ধারণাটি ছিল, যেহেতু "উত্তর" "প্রশ্নের" সাথে সম্পর্কিত, তাই আমি "প্রশ্ন" পেতে সর্বদা "উত্তর" দিয়ে যেতে পারি। তবে আপনি কি মনে করেন যে কাজগুলি করা সহজ নয়, বা আপনি কি এটি একটি খারাপ স্কিমা মনে করেন?
বিনহবয়

আপনি যদি একটি অনন্য বাধা / বৈধতা চান তবে স্কোপ করা ক্ষেত্রগুলি একই টেবিলের মধ্যে থাকতে হবে। মনে রাখবেন, রেসের শর্ত রয়েছে।
স্টেফেনসালিস

1
>> মনে হচ্ছে শেষ ব্যবহারকারীকে ডেটা জমা দেওয়ার সুযোগ দেওয়া উচিত নয় যা এই ধরণের অমিল তৈরি করে। - আপনি কখনই গ্যারান্টি দিতে পারবেন না যে যদি আপনি তার জন্য স্পষ্টত সার্ভার-সাইড চেক না করেন তবে ব্যবহারকারীর "কিছু করার কিছু নেই"।
কনস্টান্টিন

376

আপনি প্রতিনিধিও দিতে পারেন:

class Company < ActiveRecord::Base
  has_many :employees
  has_many :dogs, :through => :employees
end

class Employee < ActiveRescord::Base
  belongs_to :company
  has_many :dogs
end

class Dog < ActiveRecord::Base
  belongs_to :employee

  delegate :company, :to => :employee, :allow_nil => true
end

27
+1, এটি করার সর্বোত্তম উপায় এটি। (কমপক্ষে যা আমি ভাবতে পারি)
অরল্যান্ডো

9
জিনের সাথে এটি করার কোনও উপায় আছে যাতে এটি এতগুলি প্রশ্ন ব্যবহার না করে?
টালবয়

1
আমি নিজেকে জানতে চাই আমি যা চেষ্টা করেছি তা 3 টি নির্বাচনকে বরখাস্ত করেছে। আপনি কোনও সমিতিতে একটি "-> o যোগদান: কিছু}" ল্যাম্বদা নির্দিষ্ট করতে পারেন। যোগদানটি বরখাস্ত করা হয়েছে তবে পরবর্তীকালে অন্য কোনও নির্বাচন করুন। আমি এই টিউন করতে সক্ষম ছিল না।
রেনরা

2
@ ট্যালবয় প্রাথমিক কীগুলিতে কয়েকটি নিখুঁতভাবে নির্বাচিত প্রশ্নগুলি যে কোনও একক জওআইএন কোয়েরির চেয়ে প্রায় সবসময়ই ভাল। ডেটাবেস কঠোর পরিশ্রম করে তোলে।
রায়ান ম্যাকগেরি

1
অনুমতি_নিল কী করে? কোনও কর্মচারীর সর্বদা একটি সংস্থা থাকা উচিত নয়?
অ্যারন-কোডিং

115

এটির has_oneপরিবর্তে কেবল belongs_toআপনার পরিবর্তে ব্যবহার করুন :through:

class Choice
  belongs_to :user
  belongs_to :answer
  has_one :question, :through => :answer
end

সম্পর্কিত নয়, তবে আমি আপনার ডাটাবেসে যথাযথ অনন্য সীমাবদ্ধতা ব্যবহারের পরিবর্তে বৈধতা_ ইউনিকেশন_ও ব্যবহার করতে দ্বিধা বোধ করব। আপনি রুবিতে এটি করার সময় আপনার জাতির শর্ত থাকে।


38
এই সমাধান সহ বড় সতর্কতা। আপনি যখনই চয়েস সংরক্ষণ করবেন autosave: falseএটি সেট না করা প্রশ্নটি সর্বদা সংরক্ষণ করবে ।
ক্রিস নিকোলা

@ ক্রিসনিকোলা আপনি দয়া করে কী বোঝাতে পারেন দয়া করে আপনি কী বোঝাতে চেয়েছিলেন তা আমি বুঝতে পারি নি।
aks

আমি কোথায় বোঝাতে চাইছি? আপনি যদি যথাযথ অনন্য বাধা বোঝাতে চান তবে আমার অর্থ কলাম / ক্ষেত্রের জন্য একটি অনন্য সূচক যুক্ত করা উচিত যা অবশ্যই ডাটাবেসে অনন্য হতে হবে।
ক্রিস নিকোলা

4

আমার পদ্ধতিটি ছিল ডাটাবেস কলামগুলি যুক্ত করার পরিবর্তে ভার্চুয়াল বৈশিষ্ট্য তৈরি করা।

class Choice
  belongs_to :user
  belongs_to :answer

  # ------- Helpers -------
  def question
    answer.question
  end

  # extra sugar
  def question_id
    answer.question_id
  end
end

এই পদ্ধতিরটি বেশ সহজ, তবে ট্রেড অফসের সাথে আসে। answerডিবি থেকে লোড করার জন্য এর জন্য রেলগুলি দরকার এবং তারপরেও question। আপনার প্রয়োজনীয় সংস্থাগুলি লোড করার পরে এটি পরে অনুকূলিত করা যেতে পারে (অর্থাত্ c = Choice.first(include: {answer: :question})) তবে, যদি এই অপটিমাইজেশনটি প্রয়োজনীয় হয় তবে স্টেপেনসেলিসের উত্তর সম্ভবত একটি ভাল কার্য সম্পাদনের সিদ্ধান্ত।

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


1

মনে হচ্ছে আপনি কী চান এমন একজন ব্যবহারকারী যার কাছে অনেকগুলি প্রশ্ন রয়েছে।
প্রশ্নটির অনেক উত্তর রয়েছে যার মধ্যে একটি হল ব্যবহারকারীদের পছন্দ।

আপনি কি এই পরে?

আমি এই লাইন বরাবর এমন কিছু মডেল করব:

class User
  has_many :questions
end

class Question
  belongs_to :user
  has_many   :answers
  has_one    :choice, :class_name => "Answer"

  validates_inclusion_of :choice, :in => lambda { answers }
end

class Answer
  belongs_to :question
end

1

সুতরাং আপনার নিজের পছন্দ মতো আচরণ করতে পারবেন না তবে আপনি এমন কিছু করতে পারেন যা এটির মতো মনে হয়। আপনি করতে সক্ষম হতে চানChoice.first.question

আমি অতীতে যা করেছি তা এইরকম কিছু something

class Choice
  belongs_to :user
  belongs_to :answer
  validates_uniqueness_of :answer_id, :scope => [ :question_id, :user_id ]
  ...
  def question
    answer.question
  end
end

এইভাবে আপনি এখন চয়েসে প্রশ্ন কল করতে পারেন


-1

has_many :choicesএকটি অ্যাসোসিয়েশন নামে সৃষ্টি choicesনা choicecurrent_user.choicesপরিবর্তে ব্যবহার করার চেষ্টা করুন ।

অ্যাক্টিভেকর্ড :: অ্যাসোসিয়েশনের ডকুমেন্টেশন has_manyম্যাজিক সম্পর্কে তথ্যের জন্য দেখুন ।


1
মাইকেল আপনার সাহায্যের জন্য ধন্যবাদ, তবে আমার পক্ষ থেকে একটি টাইপো আছে। আমি ইতিমধ্যে কারেন্ট_উজার.চয়েস করছি। এই ত্রুটিটি ব্যবহারকারীর এবং প্রশ্নের সাথে যুক্ত_পরিবর্তিত করতে চাইবার সাথে আমার কিছু করার আছে।
বিনহবয়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.