2016-08-22 98 views
0

我使用AJAX來獲得一些結果,但問題是我查詢兩個單獨的模型,我想將兩者和他們的關係作爲一個JSON對象返回給另一個。如何將兩個ActiveRecord查詢合併爲一個散列並轉換爲JSON?

這裏有兩種模式我試圖聯繫在一起的例子 -

Car 
    belongs_to :user 

    :id 
    :make 
    :year 
    :user_id 

User 
    has_many :cars 

    :id 
    :first_name 
    :last_name 
    :birthday 

我試圖讓它看起來像這樣 -

{ 
    1: { 
    id: 1, 
    first_name: 'Joe' 
    last_name: 'Smith' 
    cars: { 
     23: { 
     id: 23, 
     make: 'BMW', 
     year: 2009, 
     user_id: 1 
     }, 
     24: { 
     id: 24, 
     make: 'Volvo', 
     year: 2012, 
     user_id: 1 
     } 
    } 
    }, 
    2: { 
    id: 2, 
    first_name: 'Bob' 
    last_name: 'Johnson' 
    cars: { 
     35: { 
     id: 35, 
     make: 'Ford', 
     year: 2013, 
     user_id: 2 
     } 
    } 
    } 
} 
+0

你有用戶和汽車之間的關聯嗎?他們是什麼?你能顯示每個模型的片段嗎? – jaydel

+0

@jaydel好吧我更新了這個問題。它只是一個標準belongs_to/has_many關係。 –

回答

1

創建一個新的(私人)方法在你的控制器:

def format_json(users) 
    result = {} 
    users.each do |user| 
    result[user.id] = user.formatted_data 
    end 
    return result 
end 

更改行動回報:

users = Users.includes(:cars).where("<your_where_clause>").limit(<n>) 
render :json => { :result => format_json(users) }.to_json 

應用程序/模型/ user.rb

class User < ActiveRecord::Base 

    def formatted_data 
    { 
     :id   => self.id, 
     :first_name => self.first_name, 
     :last_name => self.last_name, 
     :cars  => self.get_car_info 
    } 
    end 

    def get_car_info 
    car_info = {} 
    self.cars.each do |car| 
     car_info[car.id] = car.info 
    end 
    return car_info 
    end 
end 

應用程序/模型/ car.rb

class Car < ActiveRecord::Base 
    def info 
    { 
     :id  => self.id, 
     :make => self.make, 
     :year => self.year, 
     :user_id => self.user_id 
    } 
    end 
end 
+0

感謝您的幫助。這應該可以工作,但我只是認爲我的解決方案更加獨立。 –

0

我結束了使用.as_json我發現詳細here到的ActiveRecord轉換爲純Ruby散列並將該散列傳遞給視圖。

user = User.find(params[:user_id].to_i) 

@json = {} 
@json[user.id] = user.as_json 
@json[user.id]['cars'] = {} 

user.cars.each do |car| 
    @json[user.id]['cars'][car.id] = car.as_json 
end 

render json: { status: true, users: @json }