Ruby on rails 验证阵列活动记录中的包含时出错

Ruby on rails 验证阵列活动记录中的包含时出错,ruby-on-rails,postgresql,rails-activerecord,ruby-on-rails-6,Ruby On Rails,Postgresql,Rails Activerecord,Ruby On Rails 6,我在将以下句子翻译成Rails范围时遇到一些问题: SELECT COUNT(*) FROM permission_activities pa JOIN activities a ON pa.activity_id = a.id WHERE a.method = :method AND :url ~ a.url_regex AND pa.permission_id IN(:permission_ids) 我带来了一些类似的东西: class PermissionActivity <

我在将以下句子翻译成Rails范围时遇到一些问题:

SELECT COUNT(*) FROM permission_activities pa 
JOIN activities a ON pa.activity_id = a.id 
WHERE a.method = :method AND :url ~ a.url_regex AND pa.permission_id IN(:permission_ids)
我带来了一些类似的东西:

class PermissionActivity < ApplicationRecord
  belongs_to :permission
  belongs_to :activity

  scope :allowed_access, lambda { |permissions, url, method|
    includes(:activity).where(
      'activity.method = :method AND :url LIKE activity.url_regex
      AND permission_activity.permission_id IN :permissions',
      method: method, url: url, permissions: permissions
    )
  }
end
为什么
权限
未显示为数组?我错过了什么明显的东西吗?或者我的方法是从它的概念中注定的

有用信息:

class Permission < ApplicationRecord
  has_many :permission_activities, dependent: :destroy
  has_many :activities, through: :permission_activities
end

class Activity < ApplicationRecord
  has_many :permission_activities, dependent: :destroy
  has_many :permissions, through: :permission_activities
end

class PermissionActivity < ApplicationRecord
  belongs_to :permission
  belongs_to :activity
end
类权限
这里有几个问题:

  • ~
    (在原始查询中)与正则表达式一起工作,
    类似
  • SQL中的表名应该是复数,而不是单数
  • 您正在询问的问题中的
  • 解决第一个问题很容易:用
    ~
    替换像
    这样的
    。修复第二个也很容易:使用复数。解决第三个问题也很简单:
    中的
    需要一个列表,所以在指定的占位符周围添加一些括号

    应用这些工具可以为您提供:

    scope :allowed_access, lambda { |permissions, url, method|
      includes(:activity).where(
        'activities.method = :method AND :url ~ activities.url_regex
        AND permission_activities.permission_id IN (:permissions)',
        method: method, url: url, permissions: permissions
      )
    }
    

    大多数查询不需要使用字符串:

    class PermissionActivity < ApplicationRecord
      belongs_to :permission
      belongs_to :activity
    
      def self.allowed_access(permissions, url, method)
        includes(:activity)
        .where("? ~ activities.url_regex", url)
        .where(
           activities: { 
             method: method
           },
           permission_activities: {
             permission_id: permissions
           } 
         })
      end
    end
    
    类许可活动
    当您将调用链接到
    where
    时,它将把条件与
    连接起来,当您传递条件散列时,同样适用

    不要将作用域用于多行方法——它只是创建类方法时被广泛滥用的语法糖。文档非常错误-除了
    singleton\u class.define\u method…
    之外,它绝对是蹲着的,如果您试图撞到某个东西,它会引发错误。它只是按照惯例用于声明查询数据库的方法。它使您的代码更难阅读,并隐藏了静态分析的方法


    如果您确实像创建块一样创建多行lambda。

    中的permission\u activities.permission\u id?我想你把桌名弄错了。这是一个然后是代码>(1,2,3)< /代码>,它需要PARANS。我也会认真考虑使用关键字参数——这些逻辑没有逻辑顺序,它们将很难记住。哦,原来是这样!Thx很多:D
    
    class PermissionActivity < ApplicationRecord
      belongs_to :permission
      belongs_to :activity
    
      def self.allowed_access(permissions, url, method)
        includes(:activity)
        .where("? ~ activities.url_regex", url)
        .where(
           activities: { 
             method: method
           },
           permission_activities: {
             permission_id: permissions
           } 
         })
      end
    end