如果db表名包含数字,如何创建rails模型?

时间:2014-07-28 10:03:51

标签: sqlite core-data ruby-on-rails-4 model activesupport

我正在开发应用程序,它为iOS移动应用程序生成数据库。 但iOS应用程序使用CoreData数据库(具有奇怪关联结构的sqlite)。

我理解如何使用此结构,但如果我在多对多关联(表Category和表Product等情况下使用sqlite / pg / mysql),我创建第3个表格,如Categories_products。 但不幸的是,CoreData没有创建Categories_products表 - 它创建表z_2product,其中2是Category表的ID ...

这是一个错误:

2.1.1 :010 >   CoreData::ZMetadata.all
  CoreData::ZMetadata Load (0.5ms)  SELECT "z_metadata".* FROM "z_metadata"
 => #<ActiveRecord::Relation [#<CoreData::ZMetadata Z_VERSION: 1, Z_UUID: "069CF377-DE3B-4D00-A3A9-C7CA01E7AD86", Z_PLIST: "bplist00\xD6\x01\x02\x03\x04\x05\x06\a\t\n\x17\x18\x19_\x10\x1ENSStoreModelVersionIdentif...">]> 
2.1.1 :011 > CoreData::Z2product.all
NameError: uninitialized constant CoreData::Z2product
    from (irb):11
    from /Users/bmalets/.rvm/gems/ruby-2.1.1/gems/railties-4.1.1/lib/rails/commands/console.rb:90:in `start'
    from /Users/bmalets/.rvm/gems/ruby-2.1.1/gems/railties-4.1.1/lib/rails/commands/console.rb:9:in `start'
    from /Users/bmalets/.rvm/gems/ruby-2.1.1/gems/railties-4.1.1/lib/rails/commands/commands_tasks.rb:69:in `console'
    from /Users/bmalets/.rvm/gems/ruby-2.1.1/gems/railties-4.1.1/lib/rails/commands/commands_tasks.rb:40:in `run_command!'
    from /Users/bmalets/.rvm/gems/ruby-2.1.1/gems/railties-4.1.1/lib/rails/commands.rb:17:in `<top (required)>'
    from /Users/bmalets/Documents/ror_projects/freelance/mobile_market/bin/rails:8:in `<top (required)>'
    from /Users/bmalets/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /Users/bmalets/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from -e:1:in `<main>'
2.1.1 :012 > 

我尝试在config/initializers/inflections.rb中为这些表创建规则:

ActiveSupport::Inflector.inflections(:en) do |inflect| 
   inflect.irregular 'media',        'medias'
   inflect.irregular 'z_2product',   'z_2product'
   inflect.irregular 'z_3value',     'z_3value'
   inflect.irregular 'z_metadata',   'z_metadata'
   inflect.irregular 'z_primarykey', 'z_primarykey'
end

但它并没有帮助我((

问题:

因此,在我的Rails应用程序中,我创建model Z2product以使用CoreData DB中的z_2product表。但轨道颂歌不像模型名称中的数字:(

P.S。如果rails active_record无法使用&#34; z_2product&#34;之类的名称连接sqlite表,我将编写自己的适配器,例如使用此gem sqlite3-ruby ...

请帮忙。感谢。

3 个答案:

答案 0 :(得分:0)

您不应该(很可能不能)对Core Data使用的SQLite数据库进行逆向工程。相反,您应该创建适当的模型,实体子类并处理记录的导入记录。

独立于其数据库实现,Core Data不像关系数据库那样定义连接表;相反,它使用所谓的“关系”。

我认为最简单的解决方案是进行易于阅读的导出,例如在JSON中,然后在第一次运行时导入到Core Data。

答案 1 :(得分:0)

使用&#34; sqlite3-ruby&#34;宝石:

2.1.1 :088 >   db = SQLite3::Database.new "db/core_data/productCoreData_development.sqlite"
 => #<SQLite3::Database:0x007ffb01e51f60 @tracefunc=nil, @authorizer=nil, @encoding=nil, @busy_handler=nil, @collations={}, @functions={}, @results_as_hash=nil, @type_translation=nil, @readonly=false> 
2.1.1 :097 >   db.execute( 'SELECT "z_2products".* FROM "z_2products"' ){ |row| p row }
 => #<SQLite3::Statement:0x007ffb01ee2498 @connection=#<SQLite3::Database:0x007ffb01e51f60 @tracefunc=nil, @authorizer=nil, @encoding=#<Encoding:UTF-8>, @busy_handler=nil, @collations={}, @functions={}, @results_as_hash=nil, @type_translation=nil, @readonly=false>, @remainder="", @columns=["Z_2CATEGORIES", "Z_3PRODUCTS"], @types=["INTEGER", "INTEGER"]> 
2.1.1 :098 > 

答案 2 :(得分:0)

Rails不允许将数字作为型号名称的第一个字符! 但! :)

如果数据库表名中有数字,则只需重命名模型并设置table_name:

class CoreData::ZTwoProduct < ActiveRecord::Base
  establish_connection "core_data_#{Rails.env}".to_sym
  self.table_name = 'z_2products'
end