【问题标题】:Rails conditional association on instance itselfRails 对实例本身的条件关联
【发布时间】:2018-08-23 09:46:42
【问题描述】:

假设我们有一个Comment,它通过belongs_to 关联连接到Article。 Comment 有一个名为 is_connected 的属性,它是一个布尔值。

我知道可以向belongs_to 关系添加条件。是否可以在实例本身上添加条件?

class Comment
  belongs_to :article, -> {where: is_connected: true}
end

就像在这个例子中一样 - is_connected 引用文章模型。但我希望这种关系只存在于comment.is_connected == true

【问题讨论】:

  • 语法错误,你可以在那个块中使用普通的ActiveRelation方法,所以:-> { where(is_connected:true) }
  • 对不起,误读了您的问题,代码示例令人困惑。您可以动态添加条件,因此您可以向 Comment 添加一个名为 self.article 的类方法,如果 comment.isconnected,您可以在其中有条件地建立关系。我将尝试起草一个示例作为答案。
  • 我怀疑您是否正确地处理了这个问题。将belongs_to设为可选不是更好,只需检查是否comment.article.exists?,这样您就不需要在表中管理单独的字段来指示关系是否存在。
  • @bo-oz - 感谢您的回复。我真的必须做出区分。该示例应该只阐明我正在尝试做的事情。
  • 根据@Akshay 的疑问,is_connected 是做什么的?

标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-5 rails-activerecord


【解决方案1】:

您可以定义条件验证:

belongs_to :article, optional: true
validates :article, presence: true, if: :is_connected

也可以选择:

validates :article, absence: true, unless: :is_connected

或者,如果您希望关联仍然被填充,但表现得好像不是,那么您需要定义一个自定义方法:

def connected_article
  is_connected ? article : nil
end

【讨论】:

    【解决方案2】:

    我不确定您为什么采用这种方法。我的意思是,如果评论中存在 article_id,那么您可以放心地说该评论与文章相关联。 is_connected 似乎是重复。 article_id present/absent 的工作方式相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      相关资源
      最近更新 更多