2017-04-17 33 views
0

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它不起作用。事实上,它不允许我分配任何值。可以是0,1,2,3或'text','emergency'等。

我试着将函数名改为type,它工作的很完美。

甚至可以使用相同的函数名称吗?或者我必须改变它到别的东西?

回答

3

只需使用轨道enum代替(但请记住,你需要用符号代替字符串):这种方式在DB 0值映射到应用程序中的:text值,1

enum chat_type: %i(text callback emergency charge) 

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

:callback值等等。

enum documentation

相关问题