বিপরীতমুখী কি করে? এটি কি এসকিউএল উত্পন্ন করে?


143

আমি মাথা ঘুরে দেখার চেষ্টা করছি inverse_ofএবং আমি তা পাই না।

উত্পন্ন স্কয়ারটি দেখতে কেমন, যদি থাকে?

না inverse_ofবিকল্প একই আচরণ যদি সঙ্গে ব্যবহার প্রদর্শন :has_many, :belongs_toএবং :has_many_and_belongs_to?

দুঃখিত যদি এটি এমন একটি প্রাথমিক প্রশ্ন হয়।

আমি এই উদাহরণটি দেখেছি:

class Player < ActiveRecord::Base
  has_many :cards, :inverse_of => :player
end

class Card < ActiveRecord::Base
  belongs_to :player, :inverse_of => :cards
end

উত্তর:


125

ডকুমেন্টেশন থেকে , দেখে মনে হচ্ছে :inverse_ofবিকল্পটি এসকিউএল অনুসন্ধানগুলি এড়ানোর জন্য নয়, সেগুলি উত্পন্ন না করে for এটি সম্পর্কের মাধ্যমে আবার আনার পরিবর্তে ইতিমধ্যে লোড হওয়া ডেটা ব্যবহার করার জন্য এটি অ্যাক্টিভেকর্ডের ইঙ্গিত।

তাদের উদাহরণ:

class Dungeon < ActiveRecord::Base
  has_many :traps, :inverse_of => :dungeon
  has_one :evil_wizard, :inverse_of => :dungeon
end

class Trap < ActiveRecord::Base
  belongs_to :dungeon, :inverse_of => :traps
end

class EvilWizard < ActiveRecord::Base
  belongs_to :dungeon, :inverse_of => :evil_wizard
end

এই ক্ষেত্রে, কলিংয়ের dungeon.traps.first.dungeonফলে dungeonকোনও নতুন লোড না করে মূল বস্তুটি ডিফল্টরূপে ফিরে আসে।


5
আপনি কী ডকুমেন্টেশনে মন্তব্যটি বুঝতে পেরেছেন: "এর_সংস্কারের জন্য_সংখ্যক বিপরীতমুখী সমিতি এড়ানো হবে" এবং তবুও ডক সেই সঠিক উদাহরণটি ব্যবহার করে। আমি এখানে কি মিস করছি?
dynex

50
এটি আমার কাছে খুব অদ্ভুত, কারণ আমার কাছে মনে হয় আপনি সর্বদা এই আচরণটি ডিফল্টরূপে চাইবেন এবং কেবলমাত্র ব্যবহারের প্রয়োজন: যখন সমিতির নামটি অনুমান করা যায় না in সংজ্ঞাটির অসঙ্গতিগুলি বিরক্তিকর হলেও এটি কয়েকটি ক্ষেত্রে আমাকে সহায়তা করেছে out কোন কারণে আমার কেবল এটি সর্বত্র আটকে রাখা উচিত নয়?
ইব্রাহিম

18
@ ইব্রাহিম এটি দেখুন, এটি 23 দিন আগে একীভূত হয়েছিল! github.com/rails/rails/pull/9522
Hut8

6
এটি কোনও সম্পর্কযুক্ত_সমাজের বিপরীতটিকে উপেক্ষা করার জন্য অর্থবোধ করে কারণ একটি রেকর্ড A এর পিতামাতার রেকর্ডের সন্তানের A রেকর্ড হওয়ার গ্যারান্টি নেই - এটি রেকর্ড A এর ভাইবাল হতে পারে তবে রেকর্ড A এর সন্তানের পিতামাতা , রেকর্ড এ। এর গ্যারান্টিযুক্ত
ডেভিড অলড্রিজ

2
ভবিষ্যতের পাঠক এই ব্লগ থেকে সহায়তা পেতে পারেন ...: ডি
অরূপ রক্ষিত

42

আমার মনে :inverse_ofহয় আপনি যখন এমন অ্যাসোসিয়েশনগুলির সাথে কাজ করছেন যা এখনও অবধি স্থায়ী হয়নি most উদাহরণ:

class Project < ActiveRecord::Base
  has_many :tasks, :inverse_of=>:project
end

class Task < ActiveRecord::Base
  belongs_to :project, :inverse_of=>:tasks
end

এখন, কনসোলে:

irb> p = Project.new
=> #<Project id: nil, name: nil, ...>
irb> t = p.tasks.build
=> #<Task id: nil, project_id: nil, ...>
irb> t.project
=> #<Project id: nil, name: nil, ...>

:inverse_ofযুক্তি ব্যতীত , t.projectফিরে আসত nil, কারণ এটি একটি স্কিল কোয়েরি ট্রিগার করে এবং ডেটা এখনও সঞ্চিত হয় না। সঙ্গে :inverse_ofআর্গুমেন্ট, ডাটা মেমরি থেকে প্রাপ্ত করা হয়।


1
অ্যাসেটস_নেস্টেড_ট্রিবিউটস_র জন্য আমার একটি সমস্যা ছিল। ডিফল্টরূপে, বিদ্যমান জড়িত সামগ্রীর জন্য কেবল নেস্টেড বৈশিষ্ট্যগুলি দেখায় (ক্রিয়া সম্পাদন করুন)। উদাহরণস্বরূপ, আপনি যদি 3 টি সম্পর্কিত বস্তুর সাথে কোনও বস্তু তৈরি করতে চান তবে আপনার মডেলগুলিতে Model.new (নতুন ক্রিয়া) এবং: বিপরীতমুখী হওয়া উচিত।
ভিক্টর মার্কোনি

4 এবং তার পরে রেলের আচরণের সাথে একমত হয়েছিলেন, তবে এটি v3 তে ঠিক কাজ করেছে (পরে কিছু অবতার বাদে, যদিও পুরানো বাক্য গঠন আবার v3.2.13-এ কাজ করে)। এবং যোগ-মডেলটিতে নোট করুন, আইডির উপস্থিতি আর প্রমাণ করতে পারবেন না - কেবলমাত্র মডেল-অবজেক্ট। দেখে মনে হচ্ছে আপনি এটির জন্য কোনও আইডি ছাড়াই কোনও সমিতি রাখতে পারেন, ভি 4 'লজিক'-এ।
জোসেফকে

হুবহু .. :inverse_ofএকই আকারে নতুন পিতামাতা এবং শিশু সত্তা তৈরি করার সময় আমার জন্য একটি সমস্যা সমাধান করে।
ডাব্লুএম

16

এই জনসংযোগের পরে ( https://github.com/rails/rails/pull/9522 ) বিপরীতমুখী_ বেশিরভাগ ক্ষেত্রেই প্রয়োজন হয় না।

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

  • :মাধ্যম
  • :বিদেশী চাবি
class Author < ApplicationRecord
  has_many :books, inverse_of: 'writer'
end

class Book < ApplicationRecord
  belongs_to :writer, class_name: 'Author', foreign_key: 'author_id'
end

a = Author.first
b = a.books.first
a.first_name == b.writer.first_name # => true
a.first_name = 'David'
a.first_name == b.writer.first_name # => true

উপরের উদাহরণে, একই অবজেক্টের একটি রেফারেন্স ভেরিয়েবল aএবং অ্যাট্রিবিউটে সংরক্ষণ করা হয় writer


আমি রেল 5 ব্যবহার করছি, এবং হয় আপনি যুক্ত করুন inverse_ofবা না করুন, ফলাফল a.first_name == b.author.first_nameসর্বদা স্বাচ্ছন্দ্যযুক্ত।
আরসলান আলী

@ আর্সলানআলি দুর্দান্ত মন্তব্যের জন্য ধন্যবাদ, আমি উত্তরটি আপডেট করেছি।
আর্টামোনভদেব

5

প্রত্যেকের জন্য কেবল একটি আপডেট - আমরা কেবলমাত্র inverse_ofএকটি অ্যাপ্লিকেশন সহ একটি has_many :throughসমিতি দিয়ে ব্যবহার করেছি


এটি মূলত "শিশু" অবজেক্টের জন্য "উত্স" অবজেক্টটিকে উপলব্ধ করে

সুতরাং আপনি যদি রেলগুলির উদাহরণ ব্যবহার করেন:

class Dungeon < ActiveRecord::Base
  has_many :traps, :inverse_of => :dungeon
  has_one :evil_wizard, :inverse_of => :dungeon
end

class Trap < ActiveRecord::Base
  belongs_to :dungeon, :inverse_of => :traps
  validates :id,
      :presence => { :message => "Dungeon ID Required", :unless => :draft? }

  private
  def draft?
      self.dungeon.draft
  end 
end

class EvilWizard < ActiveRecord::Base
  belongs_to :dungeon, :inverse_of => :evil_wizard
end

ব্যবহার :inverse_of, আরও কোনো এসকিউএল কোয়েরি করণ ছাড়া আপনি যে এটা বিপরীত এর তথ্য বস্তুর অ্যাক্সেস মঞ্জুর করবে


5

যখন আমাদের কাছে has_many এবং এর সাথে সম্পর্কযুক্ত_র সাথে 2 টি মডেল থাকে, তখন সর্বদা ইনভার্স_ফ ব্যবহার করা ভাল যা অ্যাক্টিভেকডকে জানিয়ে দেয় যে তারা সমিতির একই পক্ষের। সুতরাং যদি এক পাশ থেকে কোনও কোয়েরি ট্রিগার করা হয় তবে এটি বিপরীত দিক থেকে ট্রিগার হয়ে গেলে ক্যাশে থেকে ক্যাশে যাবে and যা পারফরম্যান্সে উন্নতি করে। 4.1 রেল থেকে, বিপরীতমুখী স্বয়ংক্রিয়ভাবে সেট হয়ে যাবে, যদি আমরা বিদেশী_কি ব্যবহার করি বা শ্রেণীর নাম পরিবর্তন করে আমাদের সুস্পষ্টভাবে সেট করতে হবে।

বিশদ এবং উদাহরণের জন্য সেরা নিবন্ধ।

http://viget.com/extend/exploring-the-inverse-of-option-on-rails-model-associations



3

আপনার যদি has_many_throughদুটি মডেল, ব্যবহারকারীর এবং ভূমিকার মধ্যে সম্পর্ক থাকে এবং বিদ্যমান বা অবৈধ প্রবেশের সাথে সংযোগকারী মডেল অ্যাসাইনমেন্টকে বৈধতা দিতে চান validates_presence of :user_id, :role_idতবে এটি কার্যকর। আপনি এখনও তার সমিতির সাথে একজন ব্যবহারকারী @ ব্যবহারকারীর উত্স তৈরি করতে পারেন @user.role(params[:role_id])যাতে ব্যবহারকারীর সংরক্ষণের ফলে অ্যাসাইনমেন্ট মডেলটির ব্যর্থতা বৈধতা না ঘটে।


-1

দয়া করে একবার দেখুন দুটি দুটি দরকারী সংস্থান

এবং এর কিছু সীমাবদ্ধতা মনে রাখবেন inverse_of:

সাথে কাজ করে না: সমিতির মাধ্যমে।

বহুমুখী সমিতিগুলির সাথে কাজ করে না।

যার জন্য_সংস্কারগুলি রয়েছে_অনেকের বিপরীত সমিতিগুলি উপেক্ষা করা হয়।

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