我有两个由has_one关系关联的模型。我们还有一个回调来初始化关联。这些类看起来(大致)如下:
class User
has_one :relevance, class_name: 'User::Relevance', inverse_of: :user, dependent: :destroy
after_create :initialize_relevance
def initialize_relevance
self[:relevance] = User::Relevance.new
end
# other garbage that *should* be irrelevant
end
class User::Relevance
belongs_to :user, inverse_of: :relevance, index: true
# more other garbage that *should* be irrelevant
end有时候,关联关系会陷入一种呆板的状态,即它是零。当发生这种情况时,我们希望在调用关系时重新初始化它,并返回它而不是零。因此,在User类中,我们将得到以下内容:
def relevance
self[:relevance] = User::Relevance.new if self[:relevance].nil?
self[:relevance]
end但这不起作用,而且nil仍然返回。我对update_attribute(User::Relevance.new)和self.create_relevance也尝试过同样的方法,但是nil似乎总是会被返回。不太确定从这里去哪里,并会喜欢任何想法。如果有帮助的话,我也可以提供更多的代码或示例。
更多细节
relevance的其他回调。发布于 2016-09-12 20:25:11
蒙古支持建立一对一的关系。这应该会有所帮助(不需要钩子或getter重写)。
has_one :relevance,
class_name: 'User::Relevance',
inverse_of: :user,
dependent: :destroy,
autobuild: true正如选项名称所暗示的那样,relevance将在访问时(如果在访问之前为0)而活跃起来。
而且,您也知道这种方式的相关性不会持续存在,对吗?
after_create :initialize_relevance
def initialize_relevance
self[:relevance] = User::Relevance.new
end因此,难怪它稍后会返回nil。
发布于 2016-09-12 20:20:59
您可以尝试在getter方法中构建relevance,而不是在回调中设置关联:
class User
def relevance
self[:relevance] || User::Relevance.new
end
end下面很好地描述了这个模式:http://blog.arkency.com/2016/07/always-present-association/
https://stackoverflow.com/questions/39457688
复制相似问题