2017-09-30 131 views
0

我有模型,如下面預先加載嵌套對象軌道

Customer.rb

has_many :appointments 
has_many :addresses 
has_many :contacts 

Address.rb

belongs_to :customer 

Contact.rb

belongs_to :customer 

Appointment.rb

belongs_to :customer 

我定義的API來回報客戶喜歡以下,但有一個額外的屬性,即appointment_id。

customers: [ 
    { 
    appointment_id: 'xxxxxxx' 
    .. 
    .. 
    .. 
    addresses: [{...}, {...}] 
    contacts: [{...},{...}] 
    }, 
    { 
    .. 
    }, 
    ..... 

] 

上述API在我通過@customers(這是客戶的陣列以及它們的嵌套的對象地址,聯繫人)的方式來定義。問題是應該如何編寫活動記錄查詢來返回如此的數據。

當前的方法:

//我約會的ID名單,我應該返回如上面的API相應的客戶數據。

cust_ids = Appointment.where(blah blah blah).pluck(:customer_id) 
@customers = Customer.where(appointment_id: cust_ids).includes(:addresses, :contacts) 

我想要什麼?

我上面的方法沒有@customers對象中的appointment_id。我應該如何得到它?我是否需要加入表 以及include。 ??

+0

那麼你將如何處理你的JSON中的多個'appointment_id'。由於客戶可能有多個預約ID,但我無法看到此行爲的有效JSON –

+0

@NimishGupta最初我正在提取一組預約ID,然後我正在提取相應的客戶。因此,在這些客戶數據中,我也想要這個預約ID – krishnar

+0

如果客戶有2個約會會發生什麼? 這種情況下JSON會是什麼? 請讓我知道這個問題的答案,以便我可以嘗試幫助你 –

回答

1

添加逆避免N + 1

# customer.rb 
has_many :appointments, inverse_of: :customer 

# appointment 
belongs_to :customer, inverse_of: :appointment 

現在,您可以獲取從DB約會和構建JSON

# in the controller 
appointments = Appointment.where(blah blah blah) 
    .preload(customer: [:contacts, :addresses]) 

customers = appointments.map do |appointment| 
    appointment.customer 
    .as_json(include: [:contacts, :addresses]) 
    .merge(appointment_id: appointment.id) 
end 

render json: { customers: customers } 
+1

'belongs_to customer'的反面是'約會'(複數),但'inverse_of'在這裏不是必要的[自動反向檢測](http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods .html#module-ActiveRecord :: Associations :: ClassMethods-label-Setting + Inverses)會正常工作。 – coreyward

-1

使用select在查詢:

cust_ids = Appointment.where(等等等等等等).pluck(:CUSTOMER_ID) @customers = Customer.where(appointment_id:cust_ids).includes(:地址,:觸點)。選擇( 「客戶。*」)

0

這是我能想到的

appointment_ids = Appointment.where(blah blah blah).pluck(:id) 
customers = Customer.includes(:addresses, :contacts, :appointments).where(appointments: { id: appointment_ids }) 

現在,當你會寫

customers.first.appointments你只會得到那些滿足第一個條件的約會。

而根據你的說法,每個客戶每天只能預約一次。

所以你可以預加載過程中做的到協會定義customers.first.appointments.first.id

+0

你誤解了問題。我得到了預約ID的列表,我應該返回相應的客戶數據以及該預約ID。不是第一次任命客戶。 – krishnar