【问题标题】:How to extend models in rails to always include a certain scope如何在 Rails 中扩展模型以始终包含特定范围
【发布时间】:2011-07-25 22:47:08
【问题描述】:

在我们的多租户共享数据库应用程序中,我正在寻找一种方法来扩展模型,以便在运行查询时始终将帐户范围作为 SQL 条件的一部分。理想情况下,我会扩展 ActiveRecord,以便我可以在所有相关模型中包含类似 scoped_by_account 的内容。

我在互联网上进行了搜索,发现了一个声称可以做到这一点的插件。不幸的是,据我所知,插件的范围搜索部分不起作用。该插件(可在此处找到:https://github.com/mconnell/multi_tenant)扩展了 ActiveRecord 并使用以下代码在每次搜索中“注入”附加搜索条件:

def self.unscoped
    ...
    super.apply_finder_options(:conditions => { account_id => Account.current.id })
end

据我所知,这并没有成功地将条件应用于所有搜索。如果我查询Project.all,它将返回所有结果,而忽略当前帐户。只有当我使用Project.unscoped 时它才能正常工作。

我的问题:
如何扩展 ActiveRecord 以在它为该模型运行的每个查询中包含我的附加条件?

感谢您的宝贵时间, 欧文

【问题讨论】:

    标签: ruby-on-rails activerecord ruby-on-rails-3.1


    【解决方案1】:

    你在找default_scope吗?

    【讨论】:

    • 没有。在我们的应用程序中,我们将 default_scope 用于各种其他事情(例如设置默认排序顺序等)。我正在寻找的是在低级别扩展 AR 以在它在该模型上运行的 每个 查询中插入一个条件。
    • 好的,但是为什么不将它包含在该模型的默认范围中呢?您是否还询问您是否加入到包含条件的表中?
    • 是的。条件应始终包括在内。 default_scope 不起作用的原因是它可以并且经常必须被覆盖。然后我们不得不担心再次手动包含条件。这就是我们正在寻找一种低级别、故障安全的方式来包含它的原因。我们当然可以覆盖基本的 AR finder 方法,但我一直在寻找更优雅的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 2020-08-24
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    相关资源
    最近更新 更多