Ruby on rails 当存在同名函数时,对属性应用验证

Ruby on rails 当存在同名函数时,对属性应用验证,ruby-on-rails,activerecord,rails-activerecord,Ruby On Rails,Activerecord,Rails Activerecord,聊天模式: create_table "chats", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| t.integer "chat_type", limit: 2, null: false t.text "message", limit: 65535 t.text "attachment_url", limit: 65535 t.dat

聊天
模式:

create_table "chats", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
  t.integer  "chat_type",      limit: 2,     null: false
  t.text     "message",        limit: 65535
  t.text     "attachment_url", limit: 65535
  t.datetime "created_at",                   null: false
  t.datetime "updated_at",                   null: false
end
chat.rb

class Chat < ApplicationRecord
  TYPES = %w(text callback emergency charge)

  validates :chat_type, :inclusion => { :in => 0...Chat::TYPES.size}

  def chat_type
    Chat::TYPES[read_attribute(:chat_type)]
  end
end
class Chat{:in=>0…chat::TYPES.size}
def聊天室类型
Chat::TYPES[读取属性(:Chat\u type)]
结束
结束
chat\u type
属性是数据库中的一个整数。因此,我使用
TYPES
常量和
chat\u type
函数将其映射到相应的字符串值(为方便使用,同名)

现在,当我尝试验证
chat\u type
时,它不起作用。事实上,它不允许我赋予它任何价值。可以是0、1、2、3或“文本”、“紧急”等

我试着将函数名改为
类型
,效果非常好


它甚至可以用相同的函数名完成吗?或者我必须将其更改为其他内容吗?

只需使用rails
enum
(但请记住,您需要使用符号而不是字符串):

这样一来,数据库中的
0
值映射到应用程序中的
:text
值,
1
映射到
:callback
值,依此类推


只需使用rails
enum
(但请记住,您需要使用符号而不是字符串):

这样一来,数据库中的
0
值映射到应用程序中的
:text
值,
1
映射到
:callback
值,依此类推

enum chat_type: %i(text callback emergency charge)

validates :chat_type, inclusion: { in: chat_types.keys }