0

現在、sqlite3のDataMapperを理解しています。「companies」と「apps」の2つのテーブルを作成するモデルを定義する必要があります。

各アプリは会社に属しており、各会社には多くのアプリがあります。この関係をモデルで表現したいのですが、各クラスに「has n」メソッドと「belongs_to」メソッドを追加します。一連のアプリで#createを呼び出すと、Appクラスが機能しなくなり、データベースに挿入されません。

アソシエーションメソッドがない場合は、すべて正常に機能します。

これは私のDataMapperコードです:

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
4

1 に答える 1

3

アプリが作成されていない場合、アプリを作成するときに会社をアタッチする必要があります。

どの会社にも接続されていないアプリを追加する場合は、アプリモデルでこれを使用します。

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作成されたアプリを返すため、関連付けは正しく機能します。

于 2012-11-10T03:22:04.933 に答える