Jadi saya menemukannya sendiri. Ini sebenarnya konsep yang cukup sederhana namun kuat. Ini berkaitan dengan penggunaan kembali kode seperti pada contoh di bawah ini. Pada dasarnya, idenya adalah untuk mengekstrak potongan kode umum dan / atau konteks tertentu untuk membersihkan model dan menghindari mereka menjadi terlalu gemuk dan berantakan.
Sebagai contoh, saya akan meletakkan satu pola terkenal, pola taggable:
# app/models/product.rb
class Product
include Taggable
...
end
# app/models/concerns/taggable.rb
# notice that the file name has to match the module name
# (applying Rails conventions for autoloading)
module Taggable
extend ActiveSupport::Concern
included do
has_many :taggings, as: :taggable
has_many :tags, through: :taggings
class_attribute :tag_limit
end
def tags_string
tags.map(&:name).join(', ')
end
def tags_string=(tag_string)
tag_names = tag_string.to_s.split(', ')
tag_names.each do |tag_name|
tags.build(name: tag_name)
end
end
# methods defined here are going to extend the class, not the instance of it
module ClassMethods
def tag_limit(value)
self.tag_limit_value = value
end
end
end
Jadi mengikuti sampel Produk, Anda dapat menambahkan Taggable ke kelas yang Anda inginkan dan membagikan fungsinya.
Ini dijelaskan dengan cukup baik oleh DHH :
Di Rails 4, kita akan mengundang pemrogram untuk menggunakan keprihatinan dengan direktori / model / kekhawatiran default dan direktori app / controllers / concern yang secara otomatis menjadi bagian dari jalur pemuatan. Bersama dengan ActiveSupport :: Wrapper Concern, hanya cukup dukungan untuk membuat mekanisme anjak ringan ini bersinar.
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:
Model artikel:
Model Peristiwa
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.
Dan sekarang model Anda terlihat seperti ini:
Model komentar:
Model artikel:
Model Peristiwa:
2) Model Lemak yang Menguliti Kulit.
Pertimbangkan model Peristiwa. Sebuah acara memiliki banyak pengunjung dan komentar.
Biasanya, model acara mungkin terlihat seperti ini
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
dancommentable.rb
file di folder app / models / concern / eventhadir.rb
commentable.rb
Dan sekarang menggunakan Kekhawatiran, model Acara Anda berkurang menjadi
* 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
sumber
def self.my_class_method
), metode contoh dan pemanggilan metode dan arahan dalam ruang lingkup kelas. Tidak perlu untukmodule ClassMethods
add_item
, misalnya, Anda kacau. Saya ingat berpikir Rails rusak ketika beberapa validator berhenti bekerja, tetapi seseorang telah mengimplementasikannyaany?
dalam masalah. Saya mengusulkan solusi yang berbeda: gunakan kekhawatiran seperti antarmuka dalam bahasa yang berbeda. Alih-alih mendefinisikan fungsionalitas, ia mendefinisikan referensi ke instance kelas terpisah yang menangani fungsionalitas itu. Maka Anda memiliki kelas yang lebih kecil dan lebih rapi yang melakukan satu hal ...Perlu disebutkan bahwa menggunakan kekhawatiran dianggap sebagai gagasan buruk oleh banyak orang.
Beberapa alasan:
include
metode penambalan , ada sistem penanganan ketergantungan secara keseluruhan - terlalu banyak kerumitan untuk sesuatu yang merupakan pola Ruby mixin tua yang baik.Kekhawatiran adalah cara mudah untuk menembak diri sendiri di kaki, hati-hati dengan mereka.
sumber
Posting ini membantu saya memahami masalah.
sumber
Saya merasa sebagian besar contoh di sini menunjukkan kekuatan
module
daripada bagaimanaActiveSupport::Concern
menambah nilaimodule
.Contoh 1: Modul yang lebih mudah dibaca.
Jadi tanpa khawatir ini bagaimana tipikal
module
akan.Setelah refactoring dengan
ActiveSupport::Concern
.Anda melihat metode instan, metode kelas dan blok yang disertakan kurang berantakan. Kekhawatiran akan menyuntikkannya secara tepat untuk Anda. Itu salah satu keuntungan menggunakan
ActiveSupport::Concern
.Contoh 2: Tangani dependensi modul dengan anggun.
Dalam contoh ini
Bar
adalah modul yangHost
sangat dibutuhkan. Tapi karenaBar
memiliki ketergantungan denganFoo
yangHost
kelas harusinclude Foo
(tapi tunggu mengapaHost
ingin tahu tentangFoo
? Apakah bisa dihindari?).Jadi
Bar
menambah ketergantungan di mana pun ia pergi. Dan urutan inklusi juga penting di sini. Ini menambah banyak kompleksitas / ketergantungan pada basis kode besar.Setelah refactoring dengan
ActiveSupport::Concern
Sekarang terlihat sederhana.
Jika Anda berpikir mengapa kita tidak dapat menambahkan
Foo
ketergantungan padaBar
modul itu sendiri? Itu tidak akan berhasil karenamethod_injected_by_foo_to_host_klass
harus disuntikkan di kelas yang termasukBar
tidak padaBar
modul itu sendiri.Sumber: Rails ActiveSupport :: Concern
sumber
Dalam keprihatinan membuat file filename.rb
Sebagai contoh saya ingin di aplikasi saya di mana atribut create_by ada pembaruan nilai ada 1, dan 0 untuk updated_by
Jika Anda ingin memberikan argumen dalam tindakan
setelah itu sertakan dalam model Anda seperti ini:
sumber