Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.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 如果可能的话,如何创建一个可以传入对象的动态范围?_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 如果可能的话,如何创建一个可以传入对象的动态范围?

Ruby on rails 如果可能的话,如何创建一个可以传入对象的动态范围?,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我有两个范围: scope :posted_yesterday, -> { where(created_at: (Time.now.midnight - 1.day)..Time.now.midnight)} scope :num_posted_yesterday, -> { posted_yesterday.count } 我想做的是,我希望能够计算昨天发布的许多版本的。i、 e.在(n)前发布的天数 无论如何,我可以创建动态作用域来实现这一点,还是应该在我的Post

我有两个范围:

  scope :posted_yesterday, -> { where(created_at: (Time.now.midnight - 1.day)..Time.now.midnight)}
  scope :num_posted_yesterday, -> { posted_yesterday.count }  
我想做的是,我希望能够计算昨天发布的许多版本的
。i、 e.
在(n)前发布的天数


无论如何,我可以创建动态作用域来实现这一点,还是应该在我的
Post
模型上创建一个方法?

作用域使用称为lambdas的标准过程。您应该能够通过向lambda添加一个参数来实现。可能是这样的:

scope :posted_num_days_ago -> (days_ago) {
  where(
    created_at: (
      Time.now.midnight - (days_ago + 1).day)
    )..(Time.now.midnight - days_ago.day)
  )
}
这可能并不准确。我还没有测试过这个


但是我们的想法是使用
->(params){…}

这里有两个选项

  • 按照您的建议,在
    Post
    模型上创建类方法。不要忘记将其定义为
    def self.posted\u days\u ago(n)
    ,并在方法中使用
    self
    来表示类

  • 在作用域内使用参数。它看起来像这样:

    scope :posted_num_days_ago, ->(n=1) {where(created_at: ((Time.now.midnight - n.days)..(Time.now.midnight - (n-1).days)))}
    
  • 请注意我在本例中设置的默认值。您可以将其设置为您需要的任何设置。

    按如下操作:

    scope :posted_on, -> (day) { where(created_at: day.beginning_of_day..(day + 1.day).beginning_of_day)}
    scope :num_posted_on, -> { posted_on.count}
    
    假设模型名为Post,然后按如下方式调用它

    Post.posted_on(Date.today - 4.days)
    
    或(但以上是更好的选择)

    并致电:

    Post.posted_yesterday(4)
    

    简而言之,您需要计算某一天的帖子数量。对吧?对。这正是我想要的@Anujain,不要让它变得混乱,只需创建一个范围来获取一天的总计数。并将适当的值(即特定日期)传递给它。请参见下面给出的答案。如果你喜欢“昨天发布”而不是“发布”,那么你可以根据自己的要求或舒适区修改范围。那么第二个范围怎么称呼?只是
    Post.Post\u num\u days\u(2)
    ?另外,你知道是什么导致了这个问题吗?是的,不管怎样,你都这样称呼它。或者,如果您只需要返回到默认值,您甚至可以使用should参数调用它。你已经得到了关于另一个问题的答案。
    Post.posted_yesterday(4)