0

我不想使用加入

我想手动将任何字段与其他表字段进行比较

例如

选择 u.user_id,t.task_id

FROM 任务 t,用户 u

WHERE u.user_id = t.user_id

我如何在 Rails 中编写此查询?

4

3 回答 3

2

假设您的模型中有关联,您可以简单地执行以下操作

User.joins(:tasks).select('users.user_id, tasks.task_id')

你也可以这样做

User.includes(:tasks).where("user.id =tasks.user_id")

包括将做预先加载检查下面的例子或在这里阅读预先加载

users = User.limit(10)

users.each do |user|
  puts user.address.postcode
end

这将运行 11 个查询,称为 N+1 查询问题(首先查询以获取所有行,然后再次查询每一行以执行某些操作)。with include Active Record 确保使用尽可能少的查询来加载所有指定的关联。

现在当你这样做的时候;

users = User.includes(:address).limit(10)

user.each do |user|
  puts user.address.postcode
end

它将仅生成 2 个查询,如下所示

SELECT * FROM users LIMIT 10
SELECT addresses.* FROM addresses
  WHERE (addresses.user_id IN (1,2,3,4,5,6,7,8,9,10))

另外,如果您没有关联,请阅读以下内容;

您应该查看http://guides.rubyonrails.org/association_basics.html 假设您正在尝试进行内部连接,默认情况下,在 Rails 中,当我们关联两个模型然后查询它们时,我们正在进行内部连接那些桌子。

您必须在模型之间创建关联示例如下所示

class User
  has_many :reservations
  ...# your code
end

在预订中

class Reservations
  belongs_to :user
  ... #your code
end

现在当你做

User.joins(:reservations)

生成的查询如下所示

"SELECT `users`.* FROM `users` INNER JOIN `reservations` ON `reservations`.`user_id` = `users`.`id`"

您可以通过User.joins(:reservations).to_sql在终端中执行来检查查询

希望它能回答你的问题

于 2012-12-04T07:29:12.483 回答
1
User.find_by_sql("YOUR SQL QUERY HERE")
于 2012-12-04T08:16:11.947 回答
0

你可以如下使用..

 User.includes(:tasks).where("user.id =tasks.user_id").order(:user.id)
于 2012-12-04T07:38:54.237 回答