2013-08-19 2 views
1

Вот мой вопрос. У меня есть 2 связанных DataMapper модели:Создайте JSON из 2 связанных моделей Datamapper

class Task 
include DataMapper::Resource 
property :id,   Serial 
property :date,   Date 
property :amount,  Float 

belongs_to :project, :required => true 
end 

class Project 
include DataMapper::Resource 
property :id,   Serial 
property :name,  String, :required => true 
property :desc,  Text 

belongs_to :company 
has n, :tasks 
end 

Моя цель состоит в том, чтобы созданный JSON, который будет содержать дату задачи, количество и название проекта, которое должно сопровождаться PROJECT_ID. На данный момент генерации JSON имеет следующий вид:

Task.all.to_json(:only => [:date, :amount, :project_id]) 

я могу получить доступ к PROJECT_ID из модели задач, но не имею ни малейшего представления о том, как добавить соответствующее название проекта из модели проекта для каждой задачи. В SQL это выглядит как присоединиться:

select tasks.date, tasks.amount, projects.name from tasks 
inner join projects 
on tasks.project_id = projects.id; 

Может ли вы предложить правильный способ создания окончательного JSON, используя DataMapper пути, но не SQL?

спасибо.

ответ

1

Я нашел решение для своей проблемы. Вот оно:

# create new structure to store merged result 
Task_entry = Struct.new(:date, :amount, :pname) 

# array to get results from database 
all_task_items = Array.new 

# run through result and fill the array with required data 
Task.all.each do |task| 
    task_item = Task_entry.new(task.date, task.amount, task.project.name) 
    all_task_items << task_item 
end 
all_task_items.to_json # generate json 

Это работает для меня хорошо. Надеюсь, это будет полезно.