0

当我在控制台上运行它时:

ItemCategory.joins(:item_companies)

我得到我的 sql 查询是:

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

但我想要加入后的所有列,即项目公司和项目类别的所有列。请帮我。

4

2 回答 2

1

你可以做

item_categories = ItemCategory.includes(:item_companies)

哪一个项目类别,然后项目公司以及一次拍摄,然后你可以做:

item_categories.each { |ic| ic.item_companies }

您会意识到没有执行任何 sql,因为它们都是在您使用包含运行查询时加载的

于 2013-03-31T19:47:41.777 回答
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 进行奇怪的查找,这是我使用的蛮力方法。

于 2013-04-01T18:42:01.730 回答