当我在控制台上运行时:
ItemCategory.joins(:item_companies)
我的sql查询是:
SELECT `item_categories`.* FROM `item_categories` INNER JOIN `item_companies` ON `item_companies`.`item_category_id` = `item_categories`.`id`
但我希望连接后的所有列都是项目公司和项目类别的所有列。请帮帮我。
答案 0 :(得分:1)
你可以做到
item_categories = ItemCategory.includes(:item_companies)
在一次拍摄中将项目cateogires然后是项目公司,然后你可以做:
item_categories.each { |ic| ic.item_companies }
你会意识到没有执行sql,因为当你使用 includes
运行查询时它们都被加载了答案 1 :(得分:0)
正如Carlos在评论中建议的那样,您需要添加.select以指定联接表中的其他字段。请参阅http://guides.rubyonrails.org/active_record_querying。
添加以下内容有时会起作用:
ItemCategory.select("item_categories.*, item_companies.*").joins(:item_companies)
虽然你可以尝试*我以后发现额外的id字段破坏对象的问题。您可以扩展选择以执行类似的操作以删除重复的标准字段:
fnew = (item_companies.column_names - ['id', 'created_at', 'updated_at'])
fnew.map! {|f| "item_companies.#{f}"}
fnew_text = fnew.join(', ')
.select("item_categories.*, #{fnew_text}")
显然,可能有更简单的方法来执行此操作,您可以添加一种方法来简化此操作。为了避免在连接ID上获得奇怪的查找,这是我使用的蛮力方法。