Ruby on rails 轨道,有许多连接

Ruby on rails 轨道,有许多连接,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有三个模型,User、Type和TypeDescription,正如您在下面看到的,每个用户可能有许多类型,但每个类型只有一个描述。所以在优化方面,, 我认为每个TypeDescription都应该通过sql中的JOIN与类型连接,所以我使用了默认的范围和定义的连接,当我通过Type.find(id)获取类型时,这是有效的,但当我使用user=user.find(1)时,user.types中的每个类型都没有来自TypeDescription的数据,因为默认的范围只是将定义的选项添加到像fin

我有三个模型,User、Type和TypeDescription,正如您在下面看到的,每个用户可能有许多类型,但每个类型只有一个描述。所以在优化方面,, 我认为每个TypeDescription都应该通过sql中的JOIN与类型连接,所以我使用了默认的范围和定义的连接,当我通过Type.find(id)获取类型时,这是有效的,但当我使用user=user.find(1)时,user.types中的每个类型都没有来自TypeDescription的数据,因为默认的范围只是将定义的选项添加到像find这样的方法中,等等,所以我要寻找的是一个解决方案,在我的情况下,这项工作,所以我想要的是,当我得到某些或所有用户,我想要所有用户的类型,每个类型都应该有来自TypeDescription的数据

因此,代码是:

class User
  has_many :types
end

class Type
  has_one :type_description

  default_scope :joins => :type_description
end

class TypeDescription
  belongs_to :type
end

谢谢

如果希望将类型描述与类型一起使用,则需要使用:include,而不是:joins

自rails 2.1以来,“include”已更改为生成多个查询,而不是仅生成一个查询。原因是对于大型表,联接可能会产生大量重复的行,这会增加开销

这里有一个很好的方法可以找到更多的信息。在您一对一的情况下,如果您仍然希望“include”执行“join”,文章确实提到有一个过滤选项,但我自己找不到


不管怎样,阿米卡兹米是对的,就性能而言,现在可能并不重要

但是如果我将TypeDescription加入到每个类型中会更快,在这两种情况下,都有两个查询,但是JOIN比两个单独的查询更快…所以,我想在尝试User时生成两个查询;从类型中选择*在types.id=type_descriptions.id中加入类型_descriptions,其中
id
IN(1,3,5);您需要使用User.find(1,:include=>{:types=>:type_descriptions}),它将生成3个查询,这样就可以了。。。您所要做的就是将N+1查询优化为3,3足够低:)但我认为这可能更好,因为类型有一个类型描述,而不是很多,所以可以以某种方式使用联接。。。我想我将不得不以finder\u sql的形式编写查询…只是一个提示-这是过早的优化。。。不要在上面浪费时间:)