基于场的关联排除

时间:2018-06-14 17:07:16

标签: ruby associations models

我正在寻找最好的Ruby方法来实现这一目标。

我有一个Person has_many Feeds through Subscriptions。因此,我们可以执行Person.feeds之类的操作,并获取一个人订阅的所有Feed。

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

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

1 个答案:

答案 0 :(得分:1)

您可以使用以下命令调用此方法:

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

N.B。 joins采用关联的格式,在这种情况下是单数,而where采用表名,通常是复数。

这样做的顺序是:

  • 加载属于feeds
  • person
  • 将这些Feed添加到他们的subscription
  • 查询subscriptions表以仅返回订阅处于活动状态的供稿

为了重构这一点,我在相关模型中包含了几种方法:

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

# person.rb
def active_feeds
  feeds.active
end

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

(如果您希望在用户范围之外显示活动供稿,还可以在任何地方使用Feed.active的额外奖励。)

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