Saya telah membaca tentang menggunakan kekhawatiran model untuk model lemak menguliti serta KERING kode kode Anda. Berikut ini penjelasan dengan contoh:
1) MENGERINGKAN kode model
Pertimbangkan model Artikel, model Acara, dan model Komentar. Artikel atau acara memiliki banyak komentar. Komentar adalah milik Artikel atau Acara.
Secara tradisional, modelnya mungkin terlihat seperti ini:
Model komentar:
class Comment < ActiveRecord::Base
belongs_to :commentable, polymorphic: true
end
Model artikel:
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 Peristiwa
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
Seperti yang bisa kita perhatikan, ada kode penting yang sama untuk Event dan Artikel. Dengan menggunakan kekhawatiran, kami dapat mengekstrak kode umum ini dalam modul terpisah yang dapat dikomentari.
Untuk ini, buat file commentable.rb di app / models / concern.
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
Dan sekarang model Anda terlihat seperti ini:
Model komentar:
class Comment < ActiveRecord::Base
belongs_to :commentable, polymorphic: true
end
Model artikel:
class Article < ActiveRecord::Base
include Commentable
end
Model Peristiwa:
class Event < ActiveRecord::Base
include Commentable
end
2) Model Lemak yang Menguliti Kulit.
Pertimbangkan model Peristiwa. Sebuah acara memiliki banyak pengunjung dan komentar.
Biasanya, model acara mungkin terlihat seperti ini
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
Model dengan banyak asosiasi dan sebaliknya memiliki kecenderungan untuk mengakumulasi semakin banyak kode dan menjadi tidak terkelola. Kekhawatiran memberikan cara untuk menguliti modul lemak sehingga modul tersebut lebih termodulasi dan mudah dipahami.
Model di atas dapat di-refactored dengan menggunakan kekhawatiran seperti di bawah ini: Membuat attendable.rb
dan commentable.rb
file di folder app / models / concern / event
hadir.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
Dan sekarang menggunakan Kekhawatiran, model Acara Anda berkurang menjadi
class Event < ActiveRecord::Base
include Commentable
include Attendable
end
* Saat menggunakan masalah, disarankan untuk menggunakan pengelompokan berbasis 'domain' daripada pengelompokan 'teknis'. Pengelompokan Berbasis Domain seperti 'Commentable', 'Photoable', 'Attendable'. Pengelompokan teknis akan berarti 'ValidationMethods', 'FinderMethods' dll