gpt4 book ai didi

ruby-on-rails - 在 Rails 5 Application Record 类中包含一个模块

转载 作者:数据小太阳 更新时间:2023-10-29 07:23:33 24 4
gpt4 key购买 nike

我正在使用 Application Record 来简化整个应用程序的共享逻辑。

这是一个为 bool 值及其逆函数编写作用域的示例。这很有效:

class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true

def self.boolean_scope(attr, opposite = nil)
scope(attr, -> { where("#{attr}": true) })
scope(opposite, -> { where("#{attr}": false) }) if opposite.present?
end
end

class User < ApplicationRecord
boolean_scope :verified, :unverified
end

class Message < ApplicationRecord
boolean_scope :sent, :pending
end

我的 Application Record 类已经足够长,所以我可以将它分解成单独的模块并根据需要加载它们。

这是我尝试的解决方案:

class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
include ScopeHelpers
end

module ScopeHelpers
def self.boolean_scope(attr, opposite = nil)
scope(attr, -> { where("#{attr}": true) })
scope(opposite, -> { where("#{attr}": false) }) if opposite.present?
end
end

class User < ApplicationRecord
boolean_scope :verified, :unverified
end

class Message < ApplicationRecord
boolean_scope :sent, :pending
end

在这种情况下,我没有收到加载错误,但是 boolean_scopeUserMessage 上未定义。

有没有办法确保包含的模块在适当的时间加载并可供 Application Record 及其继承模型使用?


我还尝试让模型直接包含模块,但这并没有解决问题。

module ScopeHelpers
def self.boolean_scope(attr, opposite = nil)
scope(attr, -> { where("#{attr}": true) })
scope(opposite, -> { where("#{attr}": false) }) if opposite.present?
end
end

class User < ApplicationRecord
include ScopeHelpers
boolean_scope :verified, :unverified
end

class Message < ApplicationRecord
include ScopeHelpers
boolean_scope :sent, :pending
end

最佳答案

作为@Pavan 答案的替代方案,您可以这样做:

module ScopeHelpers
extend ActiveSupport::Concern # to handle ClassMethods submodule

module ClassMethods
def boolean_scope(attr, opposite = nil)
scope(attr, -> { where(attr => true) })
scope(opposite, -> { where(attr => false) }) if opposite.present?
end
end
end

# then use it as usual
class ApplicationRecord < ActiveRecord::Base
include ScopeHelpers
...
end

关于ruby-on-rails - 在 Rails 5 Application Record 类中包含一个模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44498962/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com