我正在使用應用程序記錄來簡化整個應用程序中的共享邏輯。在Rails 5應用程序記錄類中包含模塊
下面是一個爲布爾及其反轉寫入作用域的示例。這種運作良好:
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
我的應用程序記錄類有足夠長的時間這是有意義對我來說,它分解成單獨的模塊,並根據需要加載這些。
這是我嘗試的解決方案:
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_scope
然後在User
和Message
不確定。
有沒有一種方法可以確保包含的模塊在適當的時候被加載,並且可用於應用程序記錄及其繼承模型?
我也試圖讓模型直接包含模塊,但沒有解決問題。
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
良好的漁獲物。不幸的是,這些模型繼承了應用程序記錄。 AFAIK這個問題似乎與繼承無關,因爲我也嘗試過直接包含模塊。這並沒有奏效。我已經更新了這個問題。 – seancdavis