1

我试图让我的 ActiveRecord 查询更有效。我有用户和项目,用户对项目有感觉,并带有布尔响应。

这是我的模型:

用户:

has_many :feelings
has_many :items, :through => :feelings

感觉:

belongs_to :user
belongs_to :item
attr_accessible :response

物品:

attr_accessible :name

因此,我可以通过以下方式获取用户的感受列表:

User.find(1).feelings

我可以通过以下方式获得他有感觉的物品清单:

User.find(1).items

这一切都很好。不过,我想要的是在一个结果集中将上述两个查询组合起来。理想情况下,我希望能够查询用户项目的列表,并通过这些结果得到他们对每个项目的响应。

如果这是直接 SQL,我可以这样做:

SELECT * FROM items INNER JOIN feelings ON items.id=feelings.item_id WHERE feelings.user_id = 1

然后,这给了我一张桌子所需的一切。这也是 ActiveRecord 在查询时所做User.find(1).items的,除了它在创建我的结果散列之前丢弃了感觉表中的数据。

如何阻止它丢弃中间数据,从而为我节省额外的数据库查询?

任何帮助表示赞赏!

4

1 回答 1

1

你可以在 Rails 3 中使用这样的写法,

User.find(1).feelings.includes(:item)

在 Rails 2 中,

User.find(1).feelings.find(:all, :include => :item)

通常这会导致两个查询。一个选择感觉,另一个选择项目。

于 2012-04-04T00:08:53.700 回答