d3b*_*g3r 5 ruby enums ruby-on-rails
以下是我视图中的一些下拉菜单:
<div class="col-xs-3">
<%= f.select(:require_booking, get_advance_booking.collect {|p| [ p[:require_booking], p[:require_booking] ] }, {include_blank: false} , :class => 'form-control') %>
</div>
Run Code Online (Sandbox Code Playgroud)
和
<div class="col-xs-3">
<%= f.select(:instant_booking, get_instant_booking.collect {|p| [ p[:instant_booking], p[:instant_booking] ] }, {include_blank: false} , :class => 'form-control') %>
</div>
Run Code Online (Sandbox Code Playgroud)
这是我的 application_helper.rb
def get_advance_booking
ret = [{:require_booking => 'No'},{:require_booking => 'Yes'}]
end
def get_instant_booking
ret = [{:instant_booking => 'No'},{:instant_booking => 'Yes'}]
end
Run Code Online (Sandbox Code Playgroud)
但现在问题是,在我的模型中product.rb
,我无法使用相同的名称设置枚举:
class Product < ActiveRecord::Base
enum require_booking: {
No: 0,
Yes: 1
}
enum instant_booking: {
No: 0,
Yes: 1
}
end
Run Code Online (Sandbox Code Playgroud)
我收到的错误是You tried to define an enum named "instant_booking" on the model "Product", but this will generate a instance method "No?", which is already defined by another enum.
如何解决这样的冲突?
ash*_*tic 10
当您需要定义具有相同值的多个枚举时,可以使用:_prefix或:_suffix选项.如果传递的值为true,则方法的前缀/后缀为枚举的名称.也可以提供自定义值:
class Conversation < ActiveRecord::Base
enum status: [:active, :archived], _suffix: true
enum comments_status: [:active, :inactive], _prefix: :comments
end
Run Code Online (Sandbox Code Playgroud)
来源:http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html
Sib*_*ang -1
首先,就像 Marek Lipka 所说,你应该使用布尔值来处理你的情况。
如果您需要使用相同的条目定义不同的枚举,我建议使用 gem 'enumerize' ( https://github.com/brainspec/enumerize )。
最近的 Rails 支持Enum(https://api.rubyonrails.org/classes/ActiveRecord/Enum.html ),我们应该使用它。