【问题标题】:Rails scope check serialize column is presentRails 范围检查序列化列是否存在
【发布时间】:2017-09-06 02:59:02
【问题描述】:

我正在学习rails的范围

如果 QuestionSet 有一个名为 questions_list 的列,其格式为 serialize

这样

class QuestionSet < ActiveRecord::Base
  serialize :questions_list
end

然后我有一个方法叫is_order,很简单。 唯一的用途是检查 questions_list 是否存在

这样

def is_order
  self.questions_list.present?
end

我可以将它写入范围吗?或者在这种情况下,它不是一个合适的范围场景

【问题讨论】:

  • Ruby 的约定是命名一个返回布尔值且末尾带有问号的方法,所以def is_order? 而不是def is_order

标签: ruby-on-rails ruby scope


【解决方案1】:

scope 在这里是一个错误的选择,因为它总是返回一个 Active Record 并且不绑定到任何实例对象,scope 它是关于集合的。

作用域允许您指定常用的查询,这些查询可以是 引用为关联对象或模型上的方法调用。

【讨论】:

    【解决方案2】:

    如果您的目标是创建一个范围,该范围将返回具有 questions_list 的 QuestionSet 记录,您应该能够定义这样的范围:

    scope :with_questions_list, -> { where.not(questions_list: nil) }
    

    然后你可以这样做:

    QuestionSet.with_questions_list # This is the same as QuestionSet.all.with_questions_list
    

    如果目标是构建一个为单个对象返回 truefalse 的方法,那么您做得正确,但我建议进行两个更改:(1)您不需要引用self(正如上下文中所暗示的那样)和(2)您应该使用在方法末尾放置问号的Ruby约定。

    def is_order?
      questions_list.present?
    end
    

    【讨论】:

    • 不,我的目标是从QuestionSet' 的实例中返回一个布尔值,例如q = QuestionSet.lastq.is_order =&gt; true,我可以通过一种方法来实现,我只是想知道如何制作scope
    • 好的,但这不是范围。范围是在 ActiveRecord 集合上调用的类方法,而不是单个对象。
    • all可以省略,这里不需要。
    • 同意,但我认为 OP 会更清楚。
    • 谢谢,你可以用解释更新你的答案,我会选择你作为最佳答案。
    猜你喜欢
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 2014-05-05
    • 2014-09-16
    • 1970-01-01
    相关资源
    最近更新 更多