Tôi có một số hằng số đại diện cho các tùy chọn hợp lệ trong một trong các trường của mô hình của tôi. Cách tốt nhất để xử lý các hằng số này trong Ruby là gì?Cách tốt nhất để xử lý các hằng số trong Ruby khi sử dụng Rails là gì?
Trả lời
Bạn có thể sử dụng một mảng hoặc băm cho mục đích này (trong môi trường của bạn.rb):
OPTIONS = ['one', 'two', 'three']
OPTIONS = {:one => 1, :two => 2, :three => 3}
hoặc cách khác là liệt kê c lass, cho phép bạn liệt kê trên các hằng số của bạn cũng như các phím sử dụng để kết hợp chúng:
class Enumeration
def Enumeration.add_item(key,value)
@hash ||= {}
@hash[key]=value
end
def Enumeration.const_missing(key)
@hash[key]
end
def Enumeration.each
@hash.each {|key,value| yield(key,value)}
end
def Enumeration.values
@hash.values || []
end
def Enumeration.keys
@hash.keys || []
end
def Enumeration.[](key)
@hash[key]
end
end
mà sau đó bạn có thể xuất phát từ:
class Values < Enumeration
self.add_item(:RED, '#f00')
self.add_item(:GREEN, '#0f0')
self.add_item(:BLUE, '#00f')
end
và sử dụng như thế này:
Values::RED => '#f00'
Values::GREEN => '#0f0'
Values::BLUE => '#00f'
Values.keys => [:RED, :GREEN, :BLUE]
Values.values => ['#f00', '#0f0', '#00f']
Tôi quyết định đi với giải pháp này. Tôi phải nói, nó chỉ là những gì tôi muốn và chơi độc đáo với ActiveRecord. Cảm ơn bạn!: D – Miles
tôi đặt chúng trực tiếp trong lớp mô hình, như vậy:
class MyClass < ActiveRecord::Base
ACTIVE_STATUS = "active"
INACTIVE_STATUS = "inactive"
PENDING_STATUS = "pending"
end
Sau đó, khi sử dụng mô hình từ một lớp khác, tôi tham khảo các hằng
@model.status = MyClass::ACTIVE_STATUS
@model.save
Đó là một phương pháp không phải là một lớp học. Cần sử dụng "class" thay vì "def". – weexpectedTHIS
Bạn cũng có thể sử dụng nó trong mô hình của mình bên trong một hàm băm như sau:
class MyModel
SOME_ATTR_OPTIONS = {
:first_option => 1,
:second_option => 2,
:third_option => 3
}
end
Và sử dụng nó như thế này:
if x == MyModel::SOME_ATTR_OPTIONS[:first_option]
do this
end
Cảm ơn vì điều này. Đó là một nguồn cảm hứng cho các biểu tượng nhóm trong một mảng. – chipairon
Nếu đó là hành vi lái xe mô hình, sau đó các hằng số nên là một phần của mô hình:
class Model < ActiveRecord::Base
ONE = 1
TWO = 2
validates_inclusion_of :value, :in => [ONE, TWO]
end
này sẽ cho phép bạn sử dụng được xây dựng trong Chức năng đường ray:
>> m=Model.new
=> #<Model id: nil, value: nil, created_at: nil, updated_at: nil>
>> m.valid?
=> false
>> m.value = 1
=> 1
>> m.valid?
=> true
Hoặc, nếu cơ sở dữ liệu của bạn hỗ trợ liệt kê, bạn có thể sử dụng plugin như Enum Column .
Đường ray 4.1 được thêm support for ActiveRecord enums.
Khai báo thuộc tính enum trong đó các giá trị ánh xạ tới số nguyên trong cơ sở dữ liệu, nhưng có thể được truy vấn theo tên.
class Conversation < ActiveRecord::Base
enum status: [ :active, :archived ]
end
conversation.archived!
conversation.active? # => false
conversation.status # => "archived"
Conversation.archived # => Relation for all archived Conversations
Xem its documentation để biết chi tiết ghi lên.
Tôi nghĩ đây là câu trả lời hay nhất. –
Hãy sẵn sàng nhận ngoại lệ khi bạn cố gắng chỉ định một số giá trị không có trong danh sách cho trường trạng thái và sẵn sàng nhận xung đột tên nếu bạn thêm một trường enum khác có giá trị [: active]. Việc triển khai đường ray của tính năng này thực sự khó xử. – BitOfUniverse
tôi đã tạo ra một viên ngọc để xác nhận tính hợp lệ của enums https://github.com/CristiRazvi/enum_attributes_validation –
Bạn cũng có thể nhóm hằng vào đối tượng, sử dụng một mô-đun -
class Runner < ApplicationRecord
module RUN_TYPES
SYNC = 0
ASYNC = 1
end
end
Và sau đó có,
> Runner::RUN_TYPES::SYNC
=> 0
> Runner::RUN_TYPES::ASYNC
=> 1
- 1. Chiến lược tốt nhất để xử lý các ngoại lệ và lỗi trong Rails là gì?
- 2. Cách tốt nhất để tái sử dụng logic xử lý ngoại lệ trong C# là gì?
- 3. Cách tốt nhất để băm url trong ruby là gì?
- 4. Cách thích hợp để xử lý miền địa lý trong Ruby on Rails là gì?
- 5. Thực tiễn tốt nhất để xử lý các ngoại lệ khi sử dụng lệnh ràng buộc trong WPF là gì?
- 6. Nơi nào là nơi tốt nhất để xác định một hằng số trong ứng dụng Ruby on Rails?
- 7. Một số cách "tốt" để sử dụng longjmp/setjmp để xử lý lỗi C là gì?
- 8. cách tốt nhất để sử dụng hằng số ứng dụng trong cấu hình xml mùa xuân là gì?
- 9. Cách tốt nhất để xử lý các kiểu dữ liệu phức tạp trong CakePHP là gì?
- 10. Cách tốt nhất để xử lý bàn phím tiếng Đức khi sử dụng Emacs trên Mac OS X là gì?
- 11. Cách tốt nhất để xử lý các biểu mẫu lặp trong MVC là gì?
- 12. Cách tốt để xử lý số phiên bản trong một ứng dụng Java là gì?
- 13. Cách tốt nhất để sử dụng SOAP với Ruby là gì?
- 14. Cách tốt nhất để xử lý KeyNotFoundException
- 15. Cách tốt nhất để xử lý số lượng động các trường biểu mẫu trong PHP là gì?
- 16. Xử lý các hằng số chuỗi lớn trong Java
- 17. Cách tốt nhất để chạy công việc không đồng bộ trong ứng dụng Rails là gì?
- 18. Cách tốt nhất để xử lý quản lý thay đổi là gì?
- 19. Cách tốt nhất để lấy thư mục tạm thời trống trong Ruby on Rails là gì?
- 20. Cách tốt nhất để xử lý ngoại lệ từ Net :: HTTP là gì?
- 21. Cách tốt nhất để xử lý chuyển đổi trình tự này trong Clojure là gì?
- 22. Cách tốt nhất để xử lý javascript trong Kiểm soát tùy chỉnh là gì?
- 23. Cách tốt nhất để xử lý FBO trong OpenGL là gì?
- 24. Cách tốt nhất để xử lý các cập nhật khi lịch đồng bộ hóa các sự kiện mới là gì?
- 25. Cách tốt nhất để xử lý mật khẩu trong github là gì?
- 26. Cách tốt nhất để xử lý I18N trong bảng tra cứu là gì?
- 27. Cách tốt nhất để thiết kế cơ sở dữ liệu cho Ruby on Rails là gì?
- 28. Cách Rails để xử lý khả năng số ít/số nhiều là gì?
- 29. Thư viện xử lý ảnh Ruby/Rails
- 30. Cách tốt nhất để xử lý nhiều hành động là gì?
[Câu hỏi này khác về Enumerations trong Ruby có vẻ là rất rất giống nhau] (http://stackoverflow.com/questions/164714/how-can-i-use-c-style-enumerations-in-ruby) –