我正在开发应用程序,它为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 ...
请帮忙。感谢。
答案 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