找到连接查询的所有值

时间:2013-03-31 19:37:21

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-3.2

当我在控制台上运行时:

ItemCategory.joins(:item_companies)

我的sql查询是:

SELECT `item_categories`.* FROM `item_categories` INNER JOIN `item_companies` ON `item_companies`.`item_category_id` = `item_categories`.`id`

但我希望连接后的所有列都是项目公司和项目类别的所有列。请帮帮我。

2 个答案:

答案 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上获得奇怪的查找,这是我使用的蛮力方法。