首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何懒散地设置蒙古协会

如何懒散地设置蒙古协会
EN

Stack Overflow用户
提问于 2016-09-12 19:44:26
回答 2查看 56关注 0票数 0

我有两个由has_one关系关联的模型。我们还有一个回调来初始化关联。这些类看起来(大致)如下:

代码语言:javascript
复制
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类中,我们将得到以下内容:

代码语言:javascript
复制
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的其他回调。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-12 20:25:11

蒙古支持建立一对一的关系。这应该会有所帮助(不需要钩子或getter重写)。

代码语言:javascript
复制
has_one :relevance, 
        class_name: 'User::Relevance', 
        inverse_of: :user, 
        dependent: :destroy, 
        autobuild: true

正如选项名称所暗示的那样,relevance将在访问时(如果在访问之前为0)而活跃起来。

而且,您也知道这种方式的相关性不会持续存在,对吗?

代码语言:javascript
复制
  after_create :initialize_relevance

  def initialize_relevance
    self[:relevance] = User::Relevance.new
  end

因此,难怪它稍后会返回nil

票数 1
EN

Stack Overflow用户

发布于 2016-09-12 20:20:59

您可以尝试在getter方法中构建relevance,而不是在回调中设置关联:

代码语言:javascript
复制
class User
  def relevance
    self[:relevance] || User::Relevance.new
  end
end

下面很好地描述了这个模式:http://blog.arkency.com/2016/07/always-present-association/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39457688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档