Поиск по ассоциации (Datamapper)

У меня есть две модели, которые выглядят так

class Stage
    include DataMapper::Resource
    property :id, Serial
    belongs_to :staff
end

class Staff
  include DataMapper::Resource
  property :id, String, :key => true 
  property  :full_name, String 
  property  :email, String
  has n, :stages
end

Я пытаюсь найти все этапы, на которые назначен определенный сотрудник. Я пробовал @stages = Stage.all(Stage.Staff => 'TM')

Что я делаю неправильно?


person Tom    schedule 06.07.2010    source источник


Ответы (3)


Попробуйте это, прошло некоторое время с тех пор, как я использовал DataMapper.

Stage.all(Stage.staff.id => 'TM')

Это предполагает, что «TM» на самом деле будет значением, которое вы используете для идентификатора сотрудника.

person Hendrik    schedule 08.07.2010

На самом деле вы можете использовать строковые ключи в datamapper следующим образом:

Stage.all('staff.id' => 'TM')

or

Stage.all('staff.name.like' => 'Ted%')

Вы также можете смешивать и сочетать свойства в этой модели:

Stage.all('staff.name.like' => 'Ted%', 'id.gte' => 5 )

Это позволит получить все этапы, принадлежащие людям, чьи имена начинаются с «Тед» и имеют идентификатор больше или равный 5.

person Community    schedule 21.01.2011
comment
Чтобы было ясно, % — это синтаксис сопоставления частичной строки SQL. Вы также могли бы сделать Stage.all('staff.name' =› /^Ted/) :) и DataMapper достаточно умен, чтобы знать, как выполнять сопоставление/перевод. - person knowtheory; 23.01.2011

person    schedule
comment
Он не возвращает ошибку, но и не возвращает никаких данных. Если я запускаю его в других полях, таких как заголовок, он работает нормально, но не для внешнего ключа? - person Tom; 06.07.2010
comment
@Tom Я не могу это проверить, я бы посоветовал попробовать указать связь с: ссылками, например. Stage.all(:links => [ :staff], Stage.staff.id => 'TM') - person philant; 09.07.2010