Ruby 如果我使用DataMapper';s";有n“;及;属于;方法?
目前我正在掌握sqlite3上的DataMapper。我必须定义创建两个表的模型:“公司”和“应用程序” 每个应用程序都属于一个公司,每个公司都有许多应用程序。我想在我的模型中表示这种关系,但我向每个类添加了“hasn”和“bellings#to”方法,App类在调用#创建一组应用时停止工作,它们没有插入到数据库中 如果我没有关联方法,那么一切都很好 这是我的数据映射程序代码:Ruby 如果我使用DataMapper';s";有n“;及;属于;方法?,ruby,sqlite,associations,datamapper,belongs-to,Ruby,Sqlite,Associations,Datamapper,Belongs To,目前我正在掌握sqlite3上的DataMapper。我必须定义创建两个表的模型:“公司”和“应用程序” 每个应用程序都属于一个公司,每个公司都有许多应用程序。我想在我的模型中表示这种关系,但我向每个类添加了“hasn”和“bellings#to”方法,App类在调用#创建一组应用时停止工作,它们没有插入到数据库中 如果我没有关联方法,那么一切都很好 这是我的数据映射程序代码: DataMapper::setup(:default, "sqlite3://#{Dir.pwd}/app.db")
DataMapper::setup(:default, "sqlite3://#{Dir.pwd}/app.db")
class Company
include DataMapper::Resource
property :id, Serial
property :company_name,
property :company_id, Text, :unique => true
has n, :apps
end
class App
include DataMapper::Resource
property :id, Serial
property :app_id, Integer
property :bundle_id, Text
property :game_name, Text
property :company_name, Text
property :created_at, DateTime
property :rank, Integer
belongs_to :company
end
DataMapper.finalize.auto_upgrade!
puts 'Database and tables created'
这是我用来填充表的代码
companies_in_chart.each do |company|
@add_company = Company.create(
:company_name => company["company_name"],
:company_id => company["company_id"]
)
end
puts "Inserted companies into database"
apps_arr.each do |app|
@new_app = App.create(
:app_id => app["app_id"],
:bundle_id => app["bundle_id"],
:game_name => app["game_name"],
:company_name => app["company_name"],
:created_at => app["DateTime"],
:rank => app["rank"]
)
end
puts "Inserted apps into database"
编辑:新代码
#Set up database and apps table
DataMapper::setup(:default, "sqlite3://#{Dir.pwd}/app.db")
class Company
include DataMapper::Resource
property :id, Serial
property :company_name, Text, :required => true, :lazy => false
property :company_id, Text, :required => true, :lazy => false, :unique => true
has n, :apps
end
class App
include DataMapper::Resource
property :id, Serial
property :app_id, Integer, :required => true
property :bundle_id, Text, :required => true, :lazy => false
property :game_name, Text, :required => true, :lazy => false
property :company_id, Text, :required => true, :lazy => false
property :created_at, DateTime
property :rank, Integer
belongs_to :company
end
DataMapper.finalize.auto_upgrade!
puts 'Database and tables created'
#Insert apps and companies into database
apps_arr.each do |app|
# Creates a new company based on app entry if the company does
# not exist in the companies table
@add_company = Company.create(
:company_name => app["company_name"],
:company_id => app["company_id"]
)
@add_app = App.create(
:app_id => app["app_id"],
:bundle_id => app["bundle_id"],
:game_name => app["game_name"],
:company_id => app["company_id"],
:created_at => app["DateTime"],
:rank => app["rank"]
)
end
puts "Inserted app and companies into database"
@company = Company.first
ap @company # => #<Company @id=1 @company_name="Rovio Entertainment Ltd" @company_id="rovio">
ap @company.apps # => [] --I was hoping it would return all of Rovio's apps in the database
#设置数据库和应用程序表
DataMapper::setup(:默认值,“sqlite3://{Dir.pwd}/app.db”)
阶级公司
包含数据映射器::资源
属性:id,序列号
属性:公司名称,文本,:required=>true,:lazy=>false
属性:company\u id,Text,:required=>true,:lazy=>false,:unique=>true
有n个:应用程序
结束
类应用程序
包含数据映射器::资源
属性:id,序列号
属性:app_id,整数,:required=>true
属性:bundle\u id,Text,:required=>true,:lazy=>false
属性:game\u name,Text,:required=>true,:lazy=>false
属性:company\u id,Text,:required=>true,:lazy=>false
属性:创建于,日期时间
属性:秩,整数
属于:公司
结束
DataMapper.finalize.auto_升级!
放置“已创建数据库和表”
#将应用程序和公司插入数据库
应用程序_arr.each do |应用程序|
#根据应用程序条目创建新公司(如果公司需要)
#“公司”表中不存在
@add_company=company.create(
:company_name=>app[“company_name”],
:company_id=>app[“company_id”]
)
@add_app=app.create(
:app_id=>app[“app_id”],
:bundle\u id=>app[“bundle\u id”],
:game_name=>app[“game_name”],
:company_id=>app[“company_id”],
:创建时间=>app[“DateTime”],
:rank=>app[“rank”]
)
结束
将“插入的应用程序和公司放入数据库”
@公司第一
ap@company#=>#
ap@company.apps#=>[]——我希望它能返回数据库中Rovio的所有应用程序
未创建应用程序,因为创建应用程序时必须附加公司
如果要添加未连接到任何公司的应用程序,请在应用程序模型中使用此选项:
belongs_to :company, :required => false
要在创建应用程序时附加公司,请执行以下操作:
#Insert apps and companies into database
apps_arr.each do |app|
# Creates a new company based on app entry if the company does
# not exist in the companies table
company = Company.first_or_create(
:company_name => app["company_name"],
:company_id => app["company_id"]
)
app = App.first_or_create(
:company => company, # you missed this
:app_id => app["app_id"],
:bundle_id => app["bundle_id"],
:game_name => app["game_name"],
:company_id => app["company_id"],
:created_at => app["DateTime"],
:rank => app["rank"]
)
end
puts "Inserted app and companies into database"
我成功地在CIBox上复制了您的代码,它运行得非常好
看见
如您所见,它创建了一个公司并将其附加到创建的应用程序
Company.first.apps
返回创建的应用程序,因此关联可以正常工作。未创建的应用程序导致创建应用程序时必须附加公司
如果要添加未连接到任何公司的应用程序,请在应用程序模型中使用此选项:
belongs_to :company, :required => false
要在创建应用程序时附加公司,请执行以下操作:
#Insert apps and companies into database
apps_arr.each do |app|
# Creates a new company based on app entry if the company does
# not exist in the companies table
company = Company.first_or_create(
:company_name => app["company_name"],
:company_id => app["company_id"]
)
app = App.first_or_create(
:company => company, # you missed this
:app_id => app["app_id"],
:bundle_id => app["bundle_id"],
:game_name => app["game_name"],
:company_id => app["company_id"],
:created_at => app["DateTime"],
:rank => app["rank"]
)
end
puts "Inserted app and companies into database"
我成功地在CIBox上复制了您的代码,它运行得非常好
看见
如您所见,它创建了一个公司并将其附加到创建的应用程序
Company.first.apps
返回创建的应用程序,因此关联可以正常工作。感谢您的回复。据我所知,我已尽力按你的建议去做。关于我的新代码,请看我的问题。好的。我通过添加:company=>company
来更改代码,并且我还更改了符号:add_app
和:add_company
到变量company
和a
(我没有按照您的建议使用app
,因为变量名已被each.do | app |
使用。此代码确实将所有应用程序和公司添加到它们的表中,但是公司。首先,与第一家公司使用的所有应用程序相反,apps
仍然返回空数组,因此我认为关联不起作用.Oh,我还尝试将company=company.first\u或\u create(…)
更改为c=company.first\u或\u create(…)
,但随后我得到了错误“inblock in”:main:Object(NameError)的未定义局部变量或方法
company'由于无法识别:company=>company
中的变量company
,您需要对代码进行一些调整。这是我将如何重新组织它的。另请参阅live working demo的更新答案。非常感谢您的帮助。我想我已经成功了。您完全正确:我需要重构一大堆我认为是正确的东西这将是下一个任务!有趣的是,您的代码似乎生成了两个索引:unique\u companys\u company\u id
和index\u apps\u company
。我的代码似乎从未生成所需的第二个索引。再次感谢您的帮助!感谢您的回复。据我所知,我已尝试按照您的建议进行操作。关于我的新代码,请参见我的问题。好的。我通过添加:company=>company
更改了我的代码,我还更改了符号:add_app
和:add_company
到变量company
和a
(我没有按照您的建议使用app
,因为变量名已被each.do | app |
使用。此代码确实将所有应用程序和公司添加到它们的表中,但是公司。首先,与第一家公司使用的所有应用程序相反,apps
仍然返回空数组,因此我认为关联不起作用.Oh,我还尝试将company=company.first\u或\u create(…)
更改为c=company.first\u或\u create(…)
,但随后我得到了错误“inblock in”:main:Object(NameError)的未定义局部变量或方法
company'由于无法识别:company=>company
中的变量company
,您需要对代码进行一些调整。这是我将如何重新组织它的方法。另请参阅更新的