Ссылка на внешние ключи с помощью DataMapper - PullRequest
0 голосов
/ 31 марта 2011

Я просматривал это:

http://datamapper.org/docs/find

Но не смог осветить то, что я ищу, хотя знаю, что это довольно просто.

У меня есть две таблицы, сканы и станции с соответствующими полями:

STATIONS - id (primary key), name
SCANS    - id (primary key), item_id, in_station, out_station

Где in_station и out_station - внешние ключи к полю id в таблице stations.

У меня есть Scan объект

class Scan
    include DataMapper::Resource

    property :id,                       Integer, :key => true
    property :item_id,                  Integer
    property :in_station,               Integer
    property :out_station,              Integer
end

Так что сейчас я могу сделать Scan.all(:item_id => @barcode), чтобы получить все сканы по конкретному предмету, и у меня есть in_station id и out_station id.Какой самый лучший способ получить имена вместо идентификаторов.Я предполагаю, что это должно быть проще, чем при каждом сканировании, вызывающем Station.get(:id=> scan.in_station).

Это достаточно просто с помощью SQL, но как я могу изменить Scan / Station, чтобы получить имя или иметь свойство, которое является объектом Station,поэтому я могу сделать что-то вроде scan.station.name?

РЕДАКТИРОВАТЬ:

У меня почти все работает.У меня есть класс Station:

class Station
    include DataMapper::Resource

    property :id, Integer, :key => true
    property :name, String
end

, и я избавился от property :in_station и property :out_station в Scan и заменил на:

belongs_to :in_station,        :model => 'Station', :child_key => 'id'
belongs_to :out_station,       :model => 'Station', :child_key => 'id'

Что я думаю / надеюсь этоговоря «есть поле с именем in_station, которое является внешним ключом в таблице Station, и поле с именем out_station, которое является тем же».Действительно, in_station и out_station теперь являются экземплярами Station, НО, они являются объектом.Хотя in_station и out_station - это разные значения, я получаю один и тот же объект для каждого сканирования.Что я делаю неправильно, как я могу указать, что in_station и out_station являются ссылками на Station, но, когда их идентификаторы разные, я ожидаю разные объекты.

Ответы [ 2 ]

2 голосов
/ 31 марта 2011

Как насчет этого:

class Station
  include DataMapper::Resource

  property :id, Serial
  # rest of the properties

  has n, :scans
end

class Scan
  include DataMapper::Resource

  property :id, Serial
  # rest of the properties

  belongs_to :station
end

Затем вы просто делаете это для доступа к связанной станции:

station = Station.create
scan    = station.scans.create

scan.station # returns the associated station

Это должно работать для вас в соответствии с вашей схемой.

1 голос
/ 31 марта 2011

Предполагается, что мы не хотим изменять базовую схему SQL. Поэтому мы должны указать DataMapper использовать существующие имена внешних ключей (in_station и out_station). Суть в том, что DataMapper захлебнется, если имя ассоциации совпадает с дочерним ключом. Вот почему у меня есть префикс «my_» в именах ассоциаций.

class Scan
  include DataMapper::Resource

  #rest of the properties

  belongs_to :my_in_station, :model => 'Station', :child_key => 'in_station'
  belongs_to :my_out_station, :model => 'Station', :child_key => 'out_station'
end

Использование

s = Scan.get(id)
s.my_in_station.name
s.my_out_station.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...