【问题标题】:Trying to define named_scopes and other ActiveRecord relationships on all models试图在所有模型上定义 named_scopes 和其他 ActiveRecord 关系
【发布时间】:2009-06-25 18:03:49
【问题描述】:

我正在尝试为 Rails 应用程序中的所有模型定义一个 named_scope。

目前,通过为 ActiveRecord::Base 编写初始化程序并将常规方法放入其中,我已经能够接近这一点。 当然,在创建查询链时,这并没有真正的优势,而且可能是完成工作的最简单的方式。

但是,当我开始尝试使用 has_many、named_scope 等...ActiveRecord 方法时,它不起作用。

虽然我知道我的 named_scope 可能不正确,但我真的只需要帮助来定义 named_scope。另外,我目前对任何 Ruby ACL GEM 都不感兴趣。

在初始化器/:

class ActiveRecord::Base

  has_many(:permissions)
  named_scope(:acl_check, lambda do |user_id, method|
        {
            :include => :permission,
            :conditions => [
                ["permissions.user_id=?", user_id],
                ["permissions.method=?", method],
                ["permissions.classname=?", self.class.name]
            ]
        }
  end)

    # Conducts a permission check for the current instance.
    def check_acl?(user_id, method)

        # Perform the permission check by User.
        permission_check = Permission.find_by_user_id_and_instance_id_and_classname_and_method(user_id, self.id, self.class.name, method)
        if(permission_check)
            # If the row exists, we generate a hit.
            return(true)
        end

        # Perform the permission check by Role.

        # Otherwise, the permissions check was a miss.
        return(false)

    end

end

【问题讨论】:

    标签: ruby-on-rails inheritance activerecord models named-scope


    【解决方案1】:

    has_many 可能不起作用,因为它是在类主体中评估的,并且预期的外键用于评估它的类而不是继承类。 (例如,id=42 的博客模型可以存储许多 blog_id = 42 的评论模型,使其工作所需的键基于类名)

    如果命名的范围正确,它应该可以工作。

    继承的方法应该可以工作。

    【讨论】:

    • 是否有任何替代方法可以用来将 named_scopes 添加到我的应用程序中的所有模型?通常我对这些方法没问题,但是它们不能像 named_scope 那样参与链。使用简单方法还有更多的查询活动和开销......
    • 按照您的方式定义命名范围,它适用于我的应用程序。或者,您可以使用像harukizaemon.com/2006/10/abstract-activerecord-classes-by.html 这样的抽象活动记录类来使用常规继承。要获得 has_many 等,您很可能必须向每个模型的类主体添加一个方法调用(具有许多或自定义函数)
    • 使用抽象类需要我的所有模型都扩展该类,对吧?
    • 继承自。但是,如果您创建模型包含的模块,您可以使用包含的?钩子做你梦寐以求的一切
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2018-04-02
    • 2015-10-19
    • 2021-11-14
    相关资源
    最近更新 更多