Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.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 在范围内选择Rails_Ruby On Rails_Ruby_Rails Activerecord - Fatal编程技术网

Ruby on rails 在范围内选择Rails

Ruby on rails 在范围内选择Rails,ruby-on-rails,ruby,rails-activerecord,Ruby On Rails,Ruby,Rails Activerecord,在我的模型用户中,我设置了范围: scope :count_likes, lambda { select("(SELECT count(*) from another_model) AS count") } 如果我想获得我的用户+计数\u喜欢的所有属性,我必须执行以下操作: Model.count_likes.select("users.*") 因为调用select将是默认值* 我在我的应用程序中经常使用count_,我的问题是我必须在任何地方附加selectusers.* 我

在我的模型用户中,我设置了范围:

scope :count_likes, lambda { 
     select("(SELECT count(*) from another_model) AS count") 
}
如果我想获得我的用户+计数\u喜欢的所有属性,我必须执行以下操作:

Model.count_likes.select("users.*")
因为调用select将是默认值*

我在我的应用程序中经常使用count_,我的问题是我必须在任何地方附加selectusers.*

我知道默认范围,但我不认为在默认范围内选择selectusers.*是个好主意

有没有干的/更好的方法

谢谢

您只需将用户。*添加到范围中即可

scope :count_likes, lambda { 
     select("(SELECT count(*) from another_model) AS count, users.*") 
}

<>编辑:我不确定你到底想达到什么目标,但是你应该考虑使用连接,并适当地加入表来获取数据。 编辑:通常我不太喜欢做这样的改变,但正如情况所表明的那样,有时我们需要把手弄脏。在这种情况下,我会尽量减少操作次数,以进行更改。考虑:

作用域:count_likes,Proc.new{| all | s=selectSELECT count*从另一个_模型中选择count;s=s.selectusers.*除非all==false;s}

现在,您将获得用户。*无处不在。对于您只需要计数的特定位置,您可以像User.count\u likes false一样替换它,它将只提供计数。因此,变化最小


还有一种可能是将多个作用域附加在一起,一个用于计数,一个用于用户。*并使用它们来实现上述效果。

这不是另一种答案。我想留下一个关于连接的注释,但是注释不能长时间运行,我想提供代码示例

您需要的是有时获取相关表的所有字段和计数,有时获取计数时不包含users.*字段,有时可能只是user.*字段而不包含计数。因此,您必须告诉代码您想要哪一个。我认为您正在寻找的是一种例外类型的东西,默认情况下,您会获得user.*字段和计数,但当您只需要计数时,请指定关闭select'user.*'。我不认为有这样的解决方案,除了可能使用默认范围。我建议只为计数设置一个范围,为用户字段和计数设置一个范围

下面是我要做的:

class Users
  has_many :likes

  def self.with_count_likes
    joins(:likes)
      .select('users.*, count(likes.id) as count')
      .group('users.id')
  end

  def self.count_likes
    joins(:likes)
      .select('users.id, users.username, count(likes.id) as count')
      .group('users.id')
  end
...
当需要所有用户字段和likes计数时,使用\u count\u likes调用或将其链接到查询中。当您只需要计数和几个识别字段时,可以调用count_

我在这里假设,无论何时需要计数,都需要一些用户字段来标识计数的对象


请注意,有些数据库(如Oracle)可能需要按“users.*”进行分组。这是SQL中的标准,但有些数据库(如mySQL)只使用主键。

否,添加用户。*在范围内进行选择是不好的,因为在该场景中,我只需要count\u likes。好的。我回答了这个问题,因为您指定我必须在任何地方添加selectusers.*。无论如何,您也可以使用scoped作为作用域。谢谢您的回复。我的意思是,我使用count_的大多数地方都很喜欢。在我的情况下,你会怎么做?换句话说,您有一个模型,几乎每次查询时,都需要返回另一个模型的计数,但如果您使用selectblah blah blah blah blah,则必须添加用户。*每次。更新我的帖子。从我的头顶上看,这是一个粗略的想法,所以看起来可能并不健壮。