从Model.all中的关联表返回列

时间:2015-02-24 16:11:43

标签: ruby-on-rails-3 activerecord

摘要:

我有一个带有一些" belongs_to"关联,当我调用Model.all(或其他自定义方法,如果需要)时,我不仅要返回Model的所有列,还要返回每个关联模型中的一列。基本上,我不想只返回关联模型的ID,而是希望获得更友好的属性,例如" name"。

使用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模型的&#39;数字&#39;属性开始...)

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

以上仅返回&#39;标题&#39;来自ActionItem模型的属性而不是&#39;数字&#39;尽管SQL看起来正确,但来自IncidentTicket模型的属性。无论我尝试什么,似乎完全忽略了连接表上的SELECT。

显然,我在这里严重缺少某些东西,或者这样做完全错了。我觉得有一些我错过的ActiveRecord魔法使得这件事变得微不足道。任何帮助将非常感激!如果您需要更多细节,请告诉我,我觉得这有点难以解释......

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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