2015-02-24 37 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