当存在具有相同名称的函数时,对属性应用验证

时间:2017-04-17 09:52:26

标签: ruby-on-rails activerecord rails-activerecord

chats架构:

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

chat_type属性是数据库中的整数。所以我使用TYPES常量和chat_type函数(相同的名称以便于使用)将其映射到其相应的字符串值。

现在,当我尝试验证chat_type时,它不起作用。事实上,它不允许我分配任何vaalue。无论是0,1,2,3还是'文字','紧急'等等。

我尝试将函数名称更改为type,但效果非常好。

甚至可以使用相同的功能名称吗?或者我是否必须将其更改为其他内容?

1 个答案:

答案 0 :(得分:3)

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

enum chat_type: %i(text callback emergency charge)

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

这样,db中的0值被映射到应用程序中的:text值,1:callback值,依此类推。

enum documentation