摘要:
我有一个带有一些" 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魔法使得这件事变得微不足道。任何帮助将非常感激!如果您需要更多细节,请告诉我,我觉得这有点难以解释......
答案 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