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
تضمین می کند که مدل های شما تمیز و قابل حفظ هستند.
با استفاده از اسکوپ ها ، مقادیر پیش فرض ، نگاشتهای صریح و اعتبار سنجی ، می توانید اطمینان حاصل کنید که برنامه شما ضمن حفظ سطح بالایی از وضوح در پایگاه کد ، شمارش را به طور کارآمد انجام می دهد.