Ինչպես իրականացնել մոդելների ժառանգությունը կամ պոլիմորֆ հարաբերությունները Ruby on Rails-ում?
sobes.tech AI
Պատասխան AI-ից
Ruby on Rails- ում մոդելների ժառանգությունը իրականացվում է Single Table Inheritance (STI) կամ պոլիմորֆային հարաբերությունների միջոցով:
Single Table Inheritance (STI)
STI-ն հարմար է, երբ տարբեր տիպերի օբյեկտները ունեն նմանատիպ հատկություններ, բայց տարբեր վարքագիծ։ Բոլոր տվյալները պահվում են մեկ աղյուսակում, իսկ օբյեկտի տիպը որոշվում է type սյունակով։
-
Աղյուսակի և
typeսյունակի ստեղծում:# միգրացիա create_table :animals do |t| t.string :name t.string :type t.timestamps end -
Մոդելային դասերի ստեղծում, որոնք ժառանգում են հիմնականից:
# app/models/animal.rb class Animal < ApplicationRecord # Ընդհանուր տրամաբանություն բոլոր կենդանիների համար end # app/models/dog.rb class Dog < Animal # Հատուկ տրամաբանություն շների համար def bark "Woof!" end end # app/models/cat.rb class Cat < Animal # Հատուկ տրամաբանություն կատուների համար def meow "Meow!" end end -
Օգտագործում:
# կոնսոլում dog = Dog.create(name: "Buddy") cat = Cat.create(name: "Whiskers") animal = Animal.find(dog.id) # Վերադարձնում է Dog օբյեկտ
Պոլիմորֆային հարաբերություններ
Պոլիմորֆային հարաբերությունները օգտագործվում են, երբ մոդելը կարող է պատկանալ տարբեր մյուս մոդելներին։
-
Ավելացնել
_idև_typeսյունակներ կապակցվող մոդելում: Օրինակ, եթեCommentկարող է պատկանալArticleկամPhoto-ին:# միգրացիա create_table :comments do |t| t.text :body t.references :commentable, polymorphic: true, null: false t.timestamps end -
Ասոցացիայի հայտարարում մոդելներում: Մոդել
Comment-ում՝# app/models/comment.rb class Comment < ApplicationRecord belongs_to :commentable, polymorphic: true endՄոդելներում
ArticleևPhoto՝# app/models/article.rb class Article < ApplicationRecord has_many :comments, as: :commentable end # app/models/photo.rb class Photo < ApplicationRecord has_many :comments, as: :commentable end -
Օգտագործում:
# կոնսոլում article = Article.create(title: "Rails Tips") photo = Photo.create(caption: "Beautiful Sunset") article.comments.create(body: "Great article!") photo.comments.create(body: "Lovely photo!") Comment.first.commentable # Վերադարձնում է Article Comment.last.commentable # Վերադարձնում է Photo
Ընտրությունը՝ STI կամ պոլիմորֆային հարաբերություններ, կախված է տվյալների կառուցվածքից և մոդելների միջև հարաբերություններից։ STI հարմար է "is-a" հարաբերությունների համար (Dog է Animal), պոլիմորֆային հարաբերությունները՝ "has-a" հարաբերությունների համար (Article ունի Comment, Photo ունի Comment, որտեղ Comment-ը կարող է պատկանալ Article կամ Photo):