Czytałem o korzystaniu z modeli z modelami do modelowania tłuszczowych modeli, a także do OSUSZANIA kodów modeli. Oto wyjaśnienie z przykładami:
1) SUSZENIE kodów modeli
Rozważ model artykułu, model zdarzenia i model komentarza. Artykuł lub wydarzenie ma wiele komentarzy. Komentarz należy do artykułu lub wydarzenia.
Tradycyjnie modele mogą wyglądać następująco:
Model komentarza:
class Comment < ActiveRecord::Base
belongs_to :commentable, polymorphic: true
end
Model artykułu:
class Article < ActiveRecord::Base
has_many :comments, as: :commentable
def find_first_comment
comments.first(created_at DESC)
end
def self.least_commented
#return the article with least number of comments
end
end
Model zdarzenia
class Event < ActiveRecord::Base
has_many :comments, as: :commentable
def find_first_comment
comments.first(created_at DESC)
end
def self.least_commented
#returns the event with least number of comments
end
end
Jak możemy zauważyć, znaczna część kodu jest wspólna zarówno dla zdarzenia, jak i artykułu. Korzystając z obaw, możemy wyodrębnić ten wspólny kod w osobnym module Komentowalny.
W tym celu utwórz plik commentable.rb w app / models / koncernach.
module Commentable
extend ActiveSupport::Concern
included do
has_many :comments, as: :commentable
end
# for the given article/event returns the first comment
def find_first_comment
comments.first(created_at DESC)
end
module ClassMethods
def least_commented
#returns the article/event which has the least number of comments
end
end
end
A teraz twoje modele wyglądają tak:
Model komentarza:
class Comment < ActiveRecord::Base
belongs_to :commentable, polymorphic: true
end
Model artykułu:
class Article < ActiveRecord::Base
include Commentable
end
Model zdarzenia:
class Event < ActiveRecord::Base
include Commentable
end
2) Modele tłuszczów wyróżniające skórę.
Rozważ model zdarzenia. Wydarzenie ma wielu uczestników i komentarzy.
Zazwyczaj model zdarzenia może wyglądać tak
class Event < ActiveRecord::Base
has_many :comments
has_many :attenders
def find_first_comment
# for the given article/event returns the first comment
end
def find_comments_with_word(word)
# for the given event returns an array of comments which contain the given word
end
def self.least_commented
# finds the event which has the least number of comments
end
def self.most_attended
# returns the event with most number of attendes
end
def has_attendee(attendee_id)
# returns true if the event has the mentioned attendee
end
end
Modele o wielu skojarzeniach i poza tym mają tendencję do gromadzenia coraz większej ilości kodu i stają się niemożliwe do zarządzania. Obawy stanowią sposób na zminiaturyzowanie modułów tłuszczu, dzięki czemu są one bardziej modułowe i łatwe do zrozumienia.
Powyższy model można refaktoryzować, korzystając z poniższych obaw: Utwórz a attendable.rb
icommentable.rb
plik folderze app / models / koncern / event
attable.rb
module Attendable
extend ActiveSupport::Concern
included do
has_many :attenders
end
def has_attender(attender_id)
# returns true if the event has the mentioned attendee
end
module ClassMethods
def most_attended
# returns the event with most number of attendes
end
end
end
commentable.rb
module Commentable
extend ActiveSupport::Concern
included do
has_many :comments
end
def find_first_comment
# for the given article/event returns the first comment
end
def find_comments_with_word(word)
# for the given event returns an array of comments which contain the given word
end
module ClassMethods
def least_commented
# finds the event which has the least number of comments
end
end
end
A teraz używając Obawy, Twój model wydarzenia zmniejsza się do
class Event < ActiveRecord::Base
include Commentable
include Attendable
end
* Podczas korzystania zaleca się grupowanie oparte na „domenie”, a nie „techniczne”. Grupowanie w oparciu o domeny jest podobne do „Komentowalne”, „Photoable”, „Attendable”. Grupowanie techniczne oznacza „ValidationMethods”, „FinderMethods itp