基于字段的关联排除

Association Exclude Based on Field

我正在寻找完成此任务的最佳 Ruby 方法。

我有一个 Person has_many Feeds through Subscriptions。所以我们可以做 Person.feeds 之类的事情,它会获取一个人订阅的所有提要。

问题是,订阅要么被授权,要么被取消授权。使 Person.feeds 尊重 Subscription 模型上的授权 status 位的最佳方法是什么?

所以我们可以做类似 Person.feeds.where(:status => authorized) 的事情。

您可以使用如下命令调用它:

@person.feeds.joins(:subscription).where(subscriptions: { status: 'authorized' })

N.B。 joins 采用协会的格式,在本例中为单数,而 where 采用 table 名称,通常为复数形式。

这样做的顺序是:

  • 加载属于 person
  • feeds
  • 将这些提要加入他们的 subscription
  • 仅查询 subscriptions table 到 return 订阅有效的提要

为了重构它,我将在相关模型中包含几个方法:

# feed.rb
scope :active, -> { joins(:subscription).where(subscriptions: { status: 'authorized' }) } 

# person.rb
def active_feeds
  feeds.active
end

然后,您只需调用 @person.active_feeds 即可从代码库中的任何位置获取所需的结果。

(如果您希望在用户范围之外显示活动提要,Feed.active 的额外好处是可以在任何地方使用。)

希望对您有所帮助 - 如果您有任何问题,请告诉我。