当前位置: 首页 > 面试题库 >

带有ActiveRecord和Rails 3的复杂JOIN

房子昂
2023-03-14
问题内容

我有以下型号:

class User < ActiveRecord::Base
  has_many :memberships
  has_many :groups, :through => :memberships
end

class Group < ActiveRecord::Base
  has_many :memberships
  has_many :users, :through => :memberships
end

class Membership < ActiveRecord::Base
  belongs_to :user
  belongs_to :group
end

class Post < ActiveRecord::Base
  belongs_to :group
end

我必须找到属于user是成员的组的所有帖子。我已经用这种方法做到了:

@post = Post
  .joins(:group => {:memberships => :user})
  .where(:memberships => {:user_id => current_user.id})

但它会产生无效的SQL:

SELECT "posts".* FROM "posts" 
INNER JOIN "groups" ON "groups"."id" = "posts"."group_id" 
INNER JOIN "memberships" ON "memberships"."group_id" = "groups"."id" 
INNER JOIN "users" ON "users"."id" = "memberships"."user_id" 
WHERE "memberships"."user_id" = 1

我想这样查询:

SELECT posts.* FROM posts 
INNER JOIN memberships ON memberships.group_id = posts.group_id 
WHERE memberships.user_id = 1

不使用原始SQL怎么办?


问题答案:

像这样的事情应该为您工作,尽管它需要混入一些原始SQL

Post
  .joins("INNER JOIN memberships ON memberships.group_id = posts.group_id")
  .where(:memberships => {:user_id => current_user.id})


 类似资料:
  • 问题内容: 我在Spring(3.1)中使用以下@Cacheable: Spring: Maven: 要缓存的方法: las,当我调试代码时,我看到即使param1和param2相同(即未使用cahce),也多次调用了该缓存方法。 有任何想法吗? 问题答案: 密钥显示不正确- 您可能是说- 此外,如果在没有调试信息的情况下完成编译,则param1,param2参数名称将对表达式求值器不可用。相反,

  • 问题内容: 我有以下情况: 在我的Query.xml中,我以这种方式编写了插入内容: 阅读mybatis结果地图指南后,我尝试在mybatis-config.xml文件中添加以下行: 但我一直收到以下错误: 谁能告诉我该如何设置? 问题答案: 中的属性需要引用结果映射的名称,而不是Java类型: 但是,如果作为单独的表存储在数据库中,则不支持嵌套插入。您将需要在Java中调用两个插入。Result

  • 我一直在寻找一种能够让我: 验证复杂的(大结构、许多可选的元素子/序列、固定顺序等)XML; 为每个检查/检查块/规则定义自定义错误消息(类似XSD处理器的错误对我没有用); 如果可能,以人类可读的方式有效地定义验证模式/规则; 换句话说,类似Schematron的东西(允许自定义错误MSG,可读性等),但对于复杂的结构检查仍然很好(XPath对于顺序检查之类的事情效率很低)。 是否有一些合适的技

  • 我有一个web应用程序要用Selenium测试。有很多JavaScript在页面加载时运行。 这段JavaScript代码写得不是很好,但我无法更改任何内容。因此,使用方法等待元素出现在DOM中不是一个选项。 我想在Java中创建一个泛型函数来等待页面加载,一个可能的解决方案是: 运行JavaScript脚本表单WebDriver并将的结果存储在字符串变量中。 将变量与的以前版本进行比较。如果相同

  • 主要内容:时间复杂度,空间复杂度《 算法是什么》一节提到,解决一个问题的算法可能有多种,这种情况下,我们就必须对这些算法进行取舍,从中挑选出一个“最好”的。 算法本身是不分“好坏”的,所谓“最好”的算法,指的是最适合当前场景的算法。挑选算法时,主要考虑以下两方面因素: 执行效率:根据算法所编写的程序,执行时间越短,执行效率就越高; 占用的内存空间:不同算法编写出的程序,运行时占用的内存空间也不相同。如果实际场景中仅能使用少量的内

  • 问题内容: 我正在尝试从命令行构建一个可执行jar(我不想使用ant或OneJar)。这是我的file.jar的内容: META-INF / MANIFEST.MF的内容: ped.jar确实包含Main-Class 但是当我尝试执行file.jar时,出现错误: 所以,我在这里错过了一些东西。我不能仅通过包含依赖项来打包可执行jar吗? 谢谢你的帮助 皮埃尔 问题答案: 如前所述,属性中的jar