我知道Rails中没有真正的等价物,但我的问题主要是关于最佳实践......
在Django中,如果你想将模型字段限制为一组有限的选择,你可以这样做(在你的模型中):
COLOR_CHOICES = (('B', 'Blue'), ('R', 'Red'))
item_color = models.CharField(choices=COLOR_CHOICES)
根据我对Rails的基本理解,我可以实现类似的功能,例如,在表单中使用select标签来处理添加/编辑该模型......
我的问题是,在哪里声明“选择”哈希是合适的(再次我猜这里哈希是我需要的?)。基本上我只是希望它能够以任何形式轻松地重复使用,我可能需要提供这些选择,以及在模型级别进行验证时。
任何帮助/提示都将不胜感激!
答案 0 :(得分:10)
在事情的验证方面,你可能需要validates_inclusion_of:
class Coffee < ActiveRecord::Base
validates_inclusion_of :size, :in => %w(small medium large),
:message => "%{value} is not a valid size"
end
至于生成帮助程序,您可以尝试类似:
class Coffee < ActiveRecord::Base
@@coffe_size = %w(small medium large)
validates_inclusion_of :size, :in => @@coffe_size,
:message => "%{value} is not a valid size"
def self.coffee_size_options
@@coffe_size.map{ |z| [z,z]}
end
end
然后在一些帮手中:
<%= select(:coffee, :size, Coffee.coffee_size_options) %>
答案 1 :(得分:0)
2年后,有一个更好的选择:values_for
class Car < ActiveRecord::Base
attr_accessible :brand
values_for :brand, :has=>[:ford, :chevy, :dodge], :add=>[:constants]
def doStuff
# Now you can...
Car.brands # [:ford, :chevy, :dodge]
Car::BRAND_FORD # "ford"
myCar = Car.new(:brand=>Car::BRAND_FORD)
myCar.valid? # true
myCar.brand= "duck."
myCar.valid? # false
end
end
答案 2 :(得分:0)
您可以简单地使用枚举
class Coffee < ActiveRecord::Base
enum color: [ :blue, :red, :green ]
end
更多信息在这里:https://api.rubyonrails.org/v5.2.4.1/classes/ActiveRecord/Enum.html