Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 包含的Rails 4.1作用域失败,列未知_Ruby On Rails 4_Scope - Fatal编程技术网

Ruby on rails 4 包含的Rails 4.1作用域失败,列未知

Ruby on rails 4 包含的Rails 4.1作用域失败,列未知,ruby-on-rails-4,scope,Ruby On Rails 4,Scope,在将rails 4.0升级到4.1之后,下面的代码是 Mysql2::Error: Unknown column 'user_groups.id' in 'where clause scope :check_access, lambda {|user| includes(:user_groups).where('restrict_access is false or user_groups.id in (?)', user.get_user_group_ids) if user} 对于rai

在将rails 4.0升级到4.1之后,下面的代码是

Mysql2::Error: Unknown column 'user_groups.id' in 'where clause

scope :check_access, lambda {|user| includes(:user_groups).where('restrict_access is false or user_groups.id in (?)', user.get_user_group_ids) if user}

对于rails 4.1,上面使用的正确语法是什么?

includes
不再保证源表和包含关系之间的连接。Rails可能决定使用连接或通过两个单独的查询预加载相关信息

除了
includes
,您还应该添加
references(:user\u groups)
子句,这将为ActiveRecord提供足够的信息,以了解您的意图

scope :check_access, lambda { |user| 
  includes(:user_groups).references(:user_groups).where('restrict_access is false or user_groups.id in (?)', user.get_user_group_ids) if user
}
作为补充说明,如果用户记录存在,您的构造将返回ActiveRecord关系;如果用户记录不存在,则返回
nil
。您最好使用
.none
方法返回空集合:

scope :check_access, lambda { |user|
  if user
    includes(:user_groups)
      .references(:user_groups)
      .where('restrict_access is false or user_groups.id in (?)', user.get_user_group_ids)
  else
    none
  end
}

这样,
check\u access
将始终返回一个
ActiveRecord::Relation
集合对象,因此,如果需要,您可以安全地将其与其他作用域链接。

includes
不再保证源表和包含的关系之间的连接。Rails可能决定使用连接或通过两个单独的查询预加载相关信息

除了
includes
,您还应该添加
references(:user\u groups)
子句,这将为ActiveRecord提供足够的信息,以了解您的意图

scope :check_access, lambda { |user| 
  includes(:user_groups).references(:user_groups).where('restrict_access is false or user_groups.id in (?)', user.get_user_group_ids) if user
}
作为补充说明,如果用户记录存在,您的构造将返回ActiveRecord关系;如果用户记录不存在,则返回
nil
。您最好使用
.none
方法返回空集合:

scope :check_access, lambda { |user|
  if user
    includes(:user_groups)
      .references(:user_groups)
      .where('restrict_access is false or user_groups.id in (?)', user.get_user_group_ids)
  else
    none
  end
}

这样,
check\u access
将始终返回一个
ActiveRecord::Relation
集合对象,因此如果需要,您可以安全地将其与其他作用域链接。

每个人都是不同的,但在我的团队中,如果作用域变得如此之大,我们将把它转换为类方法。我的也是!不过,我不想在这里对
范围
的定义做太大的修改,以使建议的代码尽可能接近原始代码,这样Rails的新用户就有更好的机会跟进。我认为您处理得很好,没有离OP的问题太远。我只是想提出我的建议。你的应该是选择的答案。每个人都是不同的,但在我的团队中,如果一个作用域变得这么大,我们将把它变成一个类方法。我的也是!不过,我不想在这里对
范围
的定义做太大的修改,以使建议的代码尽可能接近原始代码,这样Rails的新用户就有更好的机会跟进。我认为您处理得很好,没有离OP的问题太远。我只是想提出我的建议。您的答案应该是选定的答案。