Rails active record concerns

Bir metodu birden fazla modelin içinde kullanma ihtiyacı duyduğumuzda(örn: SomeTokenGenerator adı altında bir iki metod) bunu models klasörü altında bulunan concerns klasörü içerisine module olarak tanımlayıp, herhangi bi model içinde include edip kullanmak concern'leri amacı dışında kullanmak mı olur acaba? Bunun best practices’leri nedir tam olarak? Şimdiden teşekkürler.

Evet. Amacı dışında bir kullanım olur. Bahsettiğiniz durum Ruby’de normal bir module tanimi. Concern ise module’e ek özellikler getiren, en temelde sınıf metodlarının da sınıflara eklenebilmesini sağlayan bir yapı. Şahsen ActiveSupport::Concern'u extend etmeyen herhangi bir module’un concerns klasöründe olmasına karşıyım.

3 Likes

Biraz klasik olacak ama, en azından bence, senin amacına göre değişir :slight_smile:

SomeTokenGenerator gibi durumlarda benim ilk tercihim Rails yerine sade Ruby objeleri (İngilizce için PORO diye aratabilirsin) kullanmak. Mesela, SomeTokenGenerator diye bir servis objesi yaratabilirsin ve ihtiyacına göre çağırabilirsin:

class SomeTokenGenerator
  def initialize(user_id)
    @user = User.find(user_id)
  end

  def call
    if generated?
      OpenStruct.new(success?: false, payload: { reason: "User cannot access." })
    else
      OpenStruct.new(success?: true, payload: { user: @user, token: @token })
    end
  end

  private

  def generated?
    # ...
  end

Ayrıca, konu biraz da seviyeyle alakalı. Eğer yeni başlıyorsan best practice’lere çokta takılmadan, ilk önce çalışan bir kodu hedefle derim. :blush:

3 Likes