小编kai*_*mcg的帖子

与ActiveRecord和Rails 3的复杂JOIN

我有以下型号:

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
Run Code Online (Sandbox Code Playgroud)

我必须找到属于用户所属组的所有帖子.我用这种方法做到了:

@post = Post
  .joins(:group => {:memberships => :user})
  .where(:memberships => {:user_id => current_user.id})
Run Code Online (Sandbox Code Playgroud)

但它会产生效率低下的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" = …
Run Code Online (Sandbox Code Playgroud)

sql activerecord join ruby-on-rails ruby-on-rails-3

9
推荐指数
2
解决办法
3万
查看次数

将参数传递给Rails内部的原始SQL查询

我想使用rails活动记录执行原始SQL查询,但是我的查询使用了一个参数,但是我找不到合适的方法来将该参数安全地传递到查询字符串中。查询如下

def self.get_branches_by_workspace_name(workspace_name)
  branches = ActiveRecord::Base.connection.execute("
    select
      address,
      phone,
      email,
      services
    from branches as b, workspaces as w
    where b.workspace_id = w.id and w.name= :workspace_name", workspace_name).to_a
  return branches
end
Run Code Online (Sandbox Code Playgroud)

我想传递一个名为“ workspace_name”的参数。有什么帮助吗?

ruby sql postgresql activerecord ruby-on-rails

4
推荐指数
3
解决办法
5237
查看次数