2015-03-31 22 views
0

我正在使用Rails連接到遠程MySQL數據庫。當做一個ActiveRecord選擇,甚至find_by_sql我注意到許多列丟失。這些列在Model.connection.select_all中正確顯示,所以問題不在數據庫發送它們。 Model.new.attributes.keysActiveRecord生成屬性的具體過程是什麼?

["ORIG_ID", "DEST_ID", "CTRL_NUM", "\nTRL_NUM", "INTEGERM", "DTTEGERM", 
"TMTEGERM", "DOC_TYPE", "STEPTYPE", "\nTEPTYPE", "TEXTTYPE", "RT_SEQPE", 
"OSYSEQPE", "OVOLUMEE", "OSUBVOLE", "OFNAMELE", "\nFNAMELE", "TEXTMELE", 
"FVOLUMEE", "FSUBVOLE", "FFNAMELE", "ASYSMELE", "AVOLUMEE", "\nVOLUMEE", 
"TEXTUMEE", "AFNAMEEE", "CONTACTE", "INTSACTE", "GRPSACTE", "\nRPSACTE", 
"INTEGERE", "SEGSGERE", "BYTESERE", "IC_NUMRE", "MSG_NUME", "\nSG_NUME", 
"TEXTNUME", "ODT_DTME", "ODT_ORIG_ID", "ODT_DEST_ID", "\nDT_DEST_ID", 
"INTEGERT_ID", "DDT_DTRT_ID", "DDT_DEST_ID", "DDT_ORIG_ID", "\nDT_ORIG_ID", 
"INTEGERG_ID", "FORMAT_IDID", "AGENCY_IDID", "VERSIONIDID", "\nERSIONIDID", 
"TEXTIONIDID", "ASETIONIDID", "PTETIONIDID", "FILLER1IDID", "SESS_NUMDID"] 

具有正確名稱的列有ORIG_IDDEST_IDCTRL_NUMDOC_TYPEODT_ORIG_IDODT_DEST_IDDDT_ORIG_IDDDT_DEST_ID列的其餘部分似乎結轉人物從以前的專欄中,除了該/ N導致列類型要來的屬性和覆蓋下一列

ORIG_ID 
DEST_ID Same length, success 
CTRL_NUM New max length, success 
\nTRL_NUM First \n character, adds new column and replaces next with field type 
INTEGERM Should be TSTAMP, took type instead 
DTTEGERM Should be DT Shorter than previous, carries all extra characters 
TMTEGERM Should be TM 
DOC_TYPE Same length as previous, overwrites all characters successfully 
STEPTYPE Should be STEP 
\nTEPTYPE 
TEXTTYPE Should be PNAME, took type instead 
RT_SEQPE Should be RT_SEQ 
OSYSEQPE etc.. 
OVOLUMEE 
OSUBVOLE 
OFNAMELE 
\nFNAMELE 
TEXTMELE Should be FSYS 
FVOLUMEE 
FSUBVOLE 
FFNAMELE 
ASYSMELE 
AVOLUMEE 
\nVOLUMEE Should be ASUBVOL 
TEXTUMEE 
AFNAMEEE 
CONTACTE 
INTSACTE 
GRPSACTE 
\nRPSACTE 
INTEGERE Should be SETS 
SEGSGERE 
BYTESERE 
IC_NUMRE 
MSG_NUME 
\nSG_NUME 
TEXTNUME Should be CDT 
ODT_DTME 
ODT_ORIG_ID 
ODT_DEST_ID 
\nDT_DEST_ID 
INTEGERT_ID Should be ODT_CTRL_NUM 
DDT_DTRT_ID 
DDT_DEST_ID 
DDT_ORIG_ID 
\nDT_ORIG_ID 
INTEGERG_ID Should be DDT_CTRL_NUM 
FORMAT_IDID 
AGENCY_IDID 
VERSIONIDID 
\nERSIONIDID 
TEXTIONIDID Should be TSET, took type instead 
ASETIONIDID 
PTETIONIDID 
FILLER1IDID 
SESS_NUMDID 

那麼,什麼是ActiveRecord的執行來獲取架構的SQL爲屬性?它將該結果轉換爲屬性的過程是什麼?

我的ActiveRecord的版本是4.1.8,Rails是4.1.8,MySql2是0.3.18,Ruby是2.1.5p273

耙:DB:模式:轉儲給出了同樣的事情

ActiveRecord::Schema.define() do 

    create_table "STEPS", id: false, force: true do |t| 
    t.string "ORIG_ID",  limit: nil, default: "NULL" 
    t.string "DEST_ID",  limit: nil, default: "NULL" 
    t.integer "CTRL_NUM",     default: 0 
    t.string "\nTRL_NUM", limit: nil, default: "NULL" 
    t.string "INTEGERM",  limit: nil, default: "NULL" 
    t.string "DTTEGERM",  limit: nil, default: "NULL" 
    t.string "TMTEGERM",  limit: nil, default: "NULL" 
    t.string "DOC_TYPE",  limit: nil, default: "NULL" 
    t.string "STEPTYPE",  limit: nil, default: "NULL" 
    t.string "\nTEPTYPE", limit: nil, default: "NULL" 
    t.string "TEXTTYPE",  limit: nil, default: "NULL" 
    t.integer "RT_SEQPE",     default: 0 
    t.string "OSYSEQPE",  limit: nil, default: "NULL" 
    t.string "OVOLUMEE",  limit: nil, default: "NULL" 
    t.string "OSUBVOLE",  limit: nil, default: "NULL" 
    t.string "OFNAMELE",  limit: nil, default: "NULL" 
    t.string "\nFNAMELE", limit: nil, default: "NULL" 
    t.string "TEXTMELE",  limit: nil, default: "NULL" 
    t.string "FVOLUMEE",  limit: nil, default: "NULL" 
    t.string "FSUBVOLE",  limit: nil, default: "NULL" 
    t.string "FFNAMELE",  limit: nil, default: "NULL" 
    t.string "ASYSMELE",  limit: nil, default: "NULL" 
    t.string "AVOLUMEE",  limit: nil, default: "NULL" 
    t.string "\nVOLUMEE", limit: nil, default: "NULL" 
    t.string "TEXTUMEE",  limit: nil, default: "NULL" 
    t.string "AFNAMEEE",  limit: nil, default: "NULL" 
    t.string "CONTACTE",  limit: nil, default: "NULL" 
    t.integer "INTSACTE",     default: 0 
    t.integer "GRPSACTE",     default: 0 
    t.string "\nRPSACTE", limit: nil, default: "NULL" 
    t.string "INTEGERE",  limit: nil, default: "NULL" 
    t.integer "SEGSGERE",     default: 0 
    t.integer "BYTESERE",     default: 0 
    t.integer "IC_NUMRE",     default: 0 
    t.integer "MSG_NUME",     default: 0 
    t.string "\nSG_NUME", limit: nil, default: "NULL" 
    t.string "TEXTNUME",  limit: nil, default: "NULL" 
    t.string "ODT_DTME",  limit: nil, default: "NULL" 
    t.string "ODT_ORIG_ID", limit: nil, default: "NULL" 
    t.string "ODT_DEST_ID", limit: nil, default: "NULL" 
    t.string "\nDT_DEST_ID", limit: nil, default: "NULL" 
    t.string "INTEGERT_ID", limit: nil, default: "NULL" 
    t.string "DDT_DTRT_ID", limit: nil, default: "NULL" 
    t.string "DDT_DEST_ID", limit: nil, default: "NULL" 
    t.string "DDT_ORIG_ID", limit: nil, default: "NULL" 
    t.string "\nDT_ORIG_ID", limit: nil, default: "NULL" 
    t.string "INTEGERG_ID", limit: nil, default: "NULL" 
    t.string "FORMAT_IDID", limit: nil, default: "NULL" 
    t.string "AGENCY_IDID", limit: nil, default: "NULL" 
    t.string "VERSIONIDID", limit: nil, default: "NULL" 
    t.string "\nERSIONIDID", limit: nil, default: "NULL" 
    t.string "TEXTIONIDID", limit: nil, default: "NULL" 
    t.string "ASETIONIDID", limit: nil, default: "NULL" 
    t.string "PTETIONIDID", limit: nil, default: "NULL" 
    t.string "FILLER1IDID", limit: nil, default: "NULL" 
    t.integer "SESS_NUMDID",    default: 0 
    end 

    add_index "STEPS", ["ECT"], name: "STEPS_05", length: {"ECT"=>"NULL"}, using: :btree 
    add_index "STEPS", ["LECT"], name: "STEPS_01", length: {"LECT"=>"NULL"}, using: :btree 
    add_index "STEPS", ["LECT"], name: "STEPS_02", length: {"LECT"=>"NULL"}, using: :btree 
    add_index "STEPS", ["LECT"], name: "STEPS_03", length: {"LECT"=>"NULL"}, using: :btree 
    add_index "STEPS", ["LECT"], name: "STEPS_04", length: {"LECT"=>"NULL"}, using: :btree 
    add_index "STEPS", ["LECT"], name: "STEPS_PK", length: {"LECT"=>"NULL"}, using: :btree 

end 

運行Model.connection.select_all("SHOW CREATE TABLE STEPS").to_hash

CREATE_TABLE = CREATE TABLE STEPS (ORIG_ID TEXT,DEST_ID TEXT,CTRL_NUM INTEGER,TSTAMP INTEGER,DT TEXT,TM TEXT,DOC_TYPE TEXT,STEP TEXT,PNAME TEXT,RT_SEQ INTEGER,OBJECT TEXT,DATAFILE TEXT,ACTION TEXT,CONTACT TEXT,INTS INTEGER,GRPS INTEGER,SETS INTEGER,SEGS INTEGER,BYTES INTEGER,IC_NUM INTEGER,MSG_NUM INTEGER,CDT TEXT,FORMAT_ID TEXT,AGENCY TEXT,VERSION TEXT,TSET TEXT,ASET TEXT,PT TEXT,SESS_NUM INTEGER,SENDER TEXT, RECEIVER TEXT,GS_SENDER TEXT, GS_RECEIVER TEXT, GS_CTRL_NUM INTEGER) 

回答

0

我發現我認爲ActiveRecord用於獲取ActiveRecord Gem的abstract_mysql_adapter.rb文件中的列名的SQL。 \Ruby2.1.0\lib\ruby\gems\2.1.0\gems\activerecord-4.1.8\lib\active_record\connection_adapters\abstract_mysql_adapter.rb

def columns(table_name)#:nodoc: 
    sql = "SHOW FULL FIELDS FROM #{quote_table_name(table_name)}" 
    execute_and_free(sql, 'SCHEMA') do |result| 
     each_hash(result).map do |field| 
     field_name = set_field_encoding(field[:Field]) 
     new_column(field_name, field[:Default], field[:Type], field[:Null] == "YES", field[:Collation], field[:Extra]) 
     end 
    end 
    end 
0

好像你的數據庫,並在schema.rb你的屬性不同步。

您需要查看this answer來找出模型中顯示的內容與數據庫中顯示的內容,並查看this answer,其中顯示了當它們不同步時要執行的操作。

+0

運行rake db:schema:dump會生成一個模式,其中包含與屬性顯示的內容相同的內容。因此,它們都使用相同的SQL來構建屬性,下面是SHOW CREATE TABLE STEPS CREATE_TABLE = CREATE TABLE STEPS(ORIG_ID TEXT,DEST_ID TEXT,CTRL_NUM INTEGER,TSTAMP INTEGER,DT TEXT,TM TEXT,DOC_TYPE TEXT,STEP TEXT,PNAME TEXT ,RT_SEQ INTEGER,OBJECT TEXT,DATAFILE TEXT,ACTION TEXT,CONTACT TEXT,INTS INTEGER,GRPS INTEGER,SETS INTEGER,SEGS INTEGER,BYTES INTEGER,IC_NUM INTEGER,MSG_NUM INTEGER,CDT TEXT,FORMAT_ID TEXT,AGENCY TEXT,VERSION TEXT,TSET TEXT,ASET TEXT,PT TEXT)另外幾個字段.. – Clark 2015-03-31 18:59:11

+0

對不起,這個混亂的評論,增加了相關部分的問題。感謝您的建議。 – Clark 2015-03-31 19:22:47

相關問題