Ruby on rails 验证阵列活动记录中的包含时出错
我在将以下句子翻译成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 <
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
类权限
这里有几个问题:
~
(在原始查询中)与正则表达式一起工作,与
类似
~
替换像这样的。修复第二个也很容易:使用复数。解决第三个问题也很简单:
中的需要一个列表,所以在指定的占位符周围添加一些括号
应用这些工具可以为您提供:
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