2015-02-24 18 views
0

摘要:在Model.all從相關表返回列

我有一個模式中的一些「belongs_to的」協會,當我打電話Model.all(或其他自定義方法如果需要的話),我想不僅返回模型的所有列,但也返回每個關聯模型的一列。基本上,而不是僅僅返回相關模型的ID,我想得到一個更友好的屬性,如「名稱」。

使用Rails 3.2.x中

模型詳細信息:

我有五款車型,主要用於數據標準化。

class ActionItem < ActiveRecord::Base 
    belongs_to :action_item_status 
    belongs_to :prod_ops_acceptance 
    belongs_to :action_item_priority 
    belongs_to :incident_ticket 
    <truncated the rest> 
end 

class IncidentTicket < ActiveRecord::Base 
    attr_accessible :number 
    has_many :action_items 
    validates_presence_of :number 
end 

class ActionItemPriority < ActiveRecord::Base 
attr_accessible :name 
has_many :action_items 
validates_presence_of :name 
end 

class ActionItemStatus < ActiveRecord::Base 
    attr_accessible :name 
    has_many :action_items 
    validates_presence_of :name 
end 

class ProdOpsAcceptance < ActiveRecord::Base 
    attr_accessible :name 
    has_many :action_items 
    validates_presence_of :name 
end 

嘗試的解決方案:

我試過的東西很多的組合,包括使用ActionItem.includes和ActionItem.joins無濟於事。我嘗試最新的是(只是想爲IncidentTicket模型的「數字」屬性以...開始)

ActionItem.all(
    select: 'action_items.title, incident_tickets.number', 
    joins: 'INNER JOIN incident_tickets 
      ON action_items.incident_ticket_id = incident_tickets.id') 

以上僅返回從ActionItem模型中的「標題」屬性,而不是'儘管SQL看起來正確,但仍可以從IncidentTicket模型獲取「number」屬性。無論我嘗試什麼,似乎連接表上的SELECT都被完全忽略。

很顯然,我在這裏認真地遺漏了一些東西或者完全錯誤。我覺得有一些ActiveRecord的魔術我錯過了,這使得這個微不足道。任何幫助將非常感激!請讓我知道如果你需要更多的細節,我覺得這是一種難以解釋......

回答

0

這應該爲你工作:

action_items = 
    ActionItem.joins(:incident_ticket, :action_item_priority, ...) 
    .select(%[ action_items.title, 
       incident_tickets.number AS incident_ticket_number, 
       action_item_priorities.name AS action_item_priority_name, 
       ... ] 
    ) 
    .all 

logger.info(action_items.first.incident_ticket_number) 
+0

謝謝爲答覆。試過,沒有運氣,仍然不會返回關聯表的列。 1.9.3-p484:004> ActionItem.joins(:incident_ticket).select('action_items.title,incident_tickets.number')最後 ActionItem加載(0.8ms)SELECT action_items.title,incident_tickets.number FROM'action_items 'INNER JOIN'incident_tickets' ON'incident_tickets'.'id' ='action_items'.'incident_ticket_id' ORDER BY'action_items'.'id' DESC LIMIT 1 =># irlrobot 2015-02-24 16:39:35

+0

請更具體。 ActiveRecord執行什麼查詢?返回的集合是什麼樣的?集合中的對象有哪些屬性? – 2015-02-24 16:41:26

+0

1.9.3-p484:004> ActionItem.joins(:incident_ticket).select('action_items.title,incident_tickets.number')最後 ActionItem加載(0.8ms)SELECT action_items.title,incident_tickets.number FROM'action_items' INNER JOIN'incident_tickets' ON'incident_tickets'.'id' ='action_items'.'incident_ticket_id' ORDER BY'action_items'.'id' DESC LIMIT 1 =># irlrobot 2015-02-24 16:43:18

0

我最終什麼現在做的是創造一個方法返回一個包含ActionItem.all結果的數組以及我想要注入的其他屬性。這可能會進行優化,但我沒有花更多時間專注於此:

def self.all_with_extras 
    action_items_with_extras = [] 
    action_items = ActionItem.all.to_json 
    JSON.parse(action_items).each do |ai| 
    extras = { 
     'incident_ticket_number' => IncidentTicket.find(ai['incident_ticket_id']).number, 
     'status' => ActionItemStatus.find(ai['action_item_status_id']).name, 
     'priority' => ActionItemPriority.find(ai['action_item_priority_id']).name, 
     'acceptance' => ProdOpsAcceptance.find(ai['prod_ops_acceptance_id']).name 
    } 
    with_extras = ai.merge(extras) 
    action_items_with_extras.append(with_extras) 
    end # each 
    action_items_with_extras 
end # def