我正在尝试将 Redis 集成到 Rails 应用程序中以替换“has_many through”关系。我想无缝地做到这一点,这样我们就不必在整个应用程序中更改代码。我的想法是覆盖某些类属性(例如 Speaker 类的 follower 属性)的不同方法,以便能够在使用它们时创建自定义行为:以下是我想要达到的行为:
s = Speaker.new
s.followers # calls custom getter and returns [User1, User2]
s.followers << User.create
s.followers # calls custom getter and returns [User1, User2, User3]
这是我的想法,灵感来自Ruby 中的 Overriding instance variable array's operator
class Speaker < ActiveRecord::Base
attr_accessor :followers
def initialize
super
@followers = []
class << @followers
def <<(u)
puts "setter #{u.id}"
$redis.set "speaker#{self.id}followers", u.id
super(u.id)
end
end
end
def followers
puts "getter"
user_ids = $redis.get "speaker#{self.id}followers"
User.find_all user_ids
end
end
问题是追随者getter的实现覆盖了“def <<(val)”的实现
如果没有定义吸气剂“def 追随者”:
s.followers
# []
s.followers << User.create
# "setter 1"
# [1]
s.followers
# [1]
s.followers << User.create
# "setter 2"
# [1, 2]
s.followers
# [1, 2]
如果定义了 getter“def 参加者”:
s.followers << User.create
# ["My", "Custom", "Array", User1]
s.followers
# ["My", "Custom", "Array"]
s.followers << User.create
# ["My", "Custom", "Array", User2]
s.followers
# ["My", "Custom", "Array"]
我怎样才能让 getter 和 setter "<<" 一起工作?