Ассоциации в DataMapper - PullRequest
       2

Ассоциации в DataMapper

1 голос
/ 03 сентября 2011

У меня проблемы с ассоциациями в следующем коде.

Ошибка, которую я получаю, это комментарий к последней строке кода.

Редактировать: я упростил код ...

require 'rubygems'
require 'data_mapper' # requires all the gems listed above
require 'pp'

DataMapper.setup(:default, 'sqlite:///Users/chris/Dropbox/HawkEye-DB Test/store.sqlite')

class Manufacturer
  include DataMapper::Resource
  property :id, Serial
  property :name, String

  has n, :products
end

class Product
  include DataMapper::Resource
  property :id, Serial    
  property :name, String

  belongs_to :manufacturer
  has 1, :productoptionset
end


class Productoptionset
  include DataMapper::Resource
  property :id, Serial    
  property :name, String

  belongs_to :product

end

DataMapper.auto_migrate!



# Make some manufactureres
gortex = Manufacturer.create(:name => 'Gortex')
garmin = Manufacturer.create(:name => 'Garmin')

gps = garmin.products.create(:name => 'GPS Unit')

samegps = Product.get(1)

pp samegps.productoptionset.create # undefined method `create' for nil:NilClass (NoMethodError)

Ответы [ 2 ]

4 голосов
/ 03 сентября 2011

create - это метод класса (вроде статического метода в Java), поэтому его нельзя вызывать для экземпляров (или не экземпляров в данном случае):)

Вы можете создавать свои объектыкак это

class Manufacturer
  include DataMapper::Resource
  property :id, Serial
  property :name, String

  has n, :products
end

class Product
  include DataMapper::Resource
  property :id, Serial    
  property :manufacturer_id, Integer
  property :name, String

  belongs_to :manufacturer
  has 1, :productoptionset
end


class Productoptionset
  include DataMapper::Resource
  property :id, Serial  
  property :product_id, Integer
  property :name, String

  belongs_to :product
end

DataMapper.auto_migrate!



# Make some manufactureres
gortex = Manufacturer.create(:name => 'Gortex')
garmin = Manufacturer.create(:name => 'Garmin')

garmin.products << Product.create(:name => 'GPS Unit')

samegps = Product.get(1)

samegps.productoptionset = Productoptionset.create(:name => "MyProductoptionset")
3 голосов
/ 03 сентября 2011

has 1 создает метод доступа productoptionset, который изначально nil, а не коллекция.У этого nil нет метода create.Коллекция имеет.

Вы можете создать и связать ProductOptionSet через

Productoptionset.create(:name => 'Foo', :product => gps)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...