Ruby 如果我使用DataMapper';s";有n“;及;属于;方法?

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")

目前我正在掌握sqlite3上的DataMapper。我必须定义创建两个表的模型:“公司”和“应用程序”

每个应用程序都属于一个公司,每个公司都有许多应用程序。我想在我的模型中表示这种关系,但我向每个类添加了“hasn”和“bellings#to”方法,App类在调用#创建一组应用时停止工作,它们没有插入到数据库中

如果我没有关联方法,那么一切都很好

这是我的数据映射程序代码:

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(…)
,但随后我得到了错误“in
block 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(…)
,但随后我得到了错误“in
block in”:main:Object(NameError)的未定义局部变量或方法
company'由于无法识别
:company=>company
中的变量
company
,您需要对代码进行一些调整。这是我将如何重新组织它的方法。另请参阅更新的