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)