برنامه نویسی

enums emails emars enums برای کد تمیزتر و کارآمدتر

ریل ها یک ویژگی قدرتمند به نام enum این امر به شما امکان می دهد مقادیر ویژگی را به عدد صحیح در پایگاه داده نقشه برداری کنید در حالی که آنها را در برنامه خود قابل خواندن است. این ویژگی شما را قادر می سازد به جای عدد صحیح خام در کد خود از نمادها استفاده کنید و آن را بیانگر و حفظ تر می کند.

در این پست وبلاگ ، نحوه تعریف و استفاده را بررسی خواهیم کرد enum ویژگی ها در ریل ، همه چیز را از تنظیمات اساسی گرفته تا تنظیمات پیشرفته مانند اسکوپ ، پیش فرض ، پایداری رشته و اعتبارسنجی پوشش می دهد.

استفاده اساسی

برای تعریف یک ویژگی enum ، از enum روش در مدل شما. در اینجا یک مثال ساده وجود دارد:

class Order < ActiveRecord::Base
  enum :status, [ :pending, :shipped, :delivered, :cancelled ]
end
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

چگونه کار می کند:

  • در status ستون به عنوان یک عدد صحیح در پایگاه داده ذخیره می شود.
  • :pending نقشه برداری شده است 0با :shipped به 1با :delivered به 2وت :cancelled به 3 بر اساس سفارش آنها
  • می توانید ویژگی را با استفاده از اعداد صحیح یا نمادها به روز کنید و پرس و جو کنید.
order = Order.new
order.status = :pending
order.pending? # => true
order.status  # => "pending"

order.status = 2
order.delivered? # => true
order.status    # => "delivered"
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

دامنه های داخلی

استفاده از enums به طور خودکار بر اساس مقادیر ویژگی ، دامنه ها را ایجاد می کند:

Order.pending        # Fetches all pending orders
Order.not_pending    # Fetches all non-pending orders
Order.shipped        # Fetches all shipped orders
Order.delivered      # Fetches all delivered orders
Order.cancelled      # Fetches all cancelled orders
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اگر می خواهید این دامنه ها را غیرفعال کنید ، تنظیم کنید :scopes به false:

class Order < ActiveRecord::Base
  enum :status, [ :pending, :shipped, :delivered, :cancelled ], scopes: false
end
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

تنظیم مقادیر پیش فرض

با استفاده از این ویژگی می توانید یک مقدار پیش فرض را برای یک ویژگی enum تنظیم کنید :default گزینه:

class Order < ActiveRecord::Base
  enum :status, [ :pending, :shipped, :delivered, :cancelled ], default: :pending
end

order = Order.new
order.status # => "pending"
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

نقشه برداری صریح از مقادیر enum

اگر ترجیح می دهید به جای تکیه بر تکالیف عدد صحیح ضمنی ، نقشه های خاص را تعریف کنید ، از هش استفاده کنید:

class Order < ActiveRecord::Base
  enum :status, pending: 0, shipped: 1, delivered: 2, cancelled: 3
end
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

همچنین می توانید به جای عدد صحیح از مقادیر رشته استفاده کنید (اگرچه این ممکن است عملکرد را تحت تأثیر قرار دهد):

class Order < ActiveRecord::Base
  enum :status, pending: "pending", shipped: "shipped", delivered: "delivered", cancelled: "cancelled"
end
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

دسترسی به نقشه های enum

برای بازیابی مقدار عدد صحیح نقشه برداری شده به یک نماد enum ، استفاده کنید:

Order.statuses[:pending]    # => 0
Order.statuses["shipped"] # => 1
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این در هنگام نوشتن نمایش داده های SQL RAW مفید است:

Order.where("status <> ?", Order.statuses[:cancelled])
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

پیشوندها و پسوندها

هنگام برخورد با شمارنده های متعدد که مقادیر مشابهی دارند ، می توانید از آن استفاده کنید :prefix یا :suffix برای جلوگیری از درگیری ها:

class Order < ActiveRecord::Base
  enum :status, [ :pending, :shipped, :delivered, :cancelled ], suffix: true
  enum :payment_status, [ :pending, :completed, :failed ], prefix: :payment
end
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این تولید می شود:

order.pending_status!
order.shipped_status? # => false
order.payment_completed!
order.payment_pending? # => false
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

غیرفعال کردن روشهای نمونه

اگر به روشهای تولید شده خودکار احتیاج ندارید ، می توانید آنها را غیرفعال کنید:

class Order < ActiveRecord::Base
  enum :status, [ :pending, :shipped, :delivered, :cancelled ], instance_methods: false
end
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اعتبار سنجی مقادیر enum

برای اطمینان از اختصاص فقط مقادیر معتبر enum ، استفاده کنید :validate:

class Order < ActiveRecord::Base
  enum :status, [ :pending, :shipped, :delivered, :cancelled ], validate: true
end
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مثال رفتار اعتبار سنجی:

order = Order.new
order.status = :unknown
order.valid? # => false
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

همچنین می توانید اجازه دهید nil مقادیر:

class Order < ActiveRecord::Base
  enum :status, [ :pending, :shipped, :delivered, :cancelled ], validate: { allow_nil: true }
end
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

خطاهای دست زدن به

اگر یک مقدار نامعتبر اختصاص داده شود ، ArgumentError افزایش خواهد یافت:

order.status = :unknown # Raises 'unknown' is not a valid status (ArgumentError)
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

پایان

با استفاده از enum در مدل های ریل ، کد شما را ساده می کند ، خوانایی پرس و جو را بهبود می بخشد و یکپارچگی داده ها را تقویت می کند. این که آیا شما در حال تعریف زمینه های وضعیت ساده یا تنظیمات پیچیده چند ساله هستید ، انعطاف پذیری enum تضمین می کند که مدل های شما تمیز و قابل حفظ هستند.

با استفاده از اسکوپ ها ، مقادیر پیش فرض ، نگاشتهای صریح و اعتبار سنجی ، می توانید اطمینان حاصل کنید که برنامه شما ضمن حفظ سطح بالایی از وضوح در پایگاه کد ، شمارش را به طور کارآمد انجام می دهد.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا