Попытка определить named_scopes и другие отношения ActiveRecord на всех моделях - PullRequest
1 голос
/ 25 июня 2009

Я пытаюсь определить named_scope для всех моих моделей в приложении Rails.

В настоящее время я смог приблизиться к этому, написав инициализатор для ActiveRecord :: Base и добавив туда обычные методы. Конечно, это не дает реального преимущества, когда речь идет о создании цепочек запросов, и, вероятно, является наименее надежным способом выполнения работы.

Однако это не работает, когда я начинаю пытаться использовать методы has_many, named_scope и т. Д. ... ActiveRecord.

Хотя я понимаю, что мой named_scope, скорее всего, неверен, мне действительно нужна только помощь в определении named_scope. Кроме того, я не заинтересован в каких-либо Ruby ACL GEMs.

В инициализаторах /:

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

1 Ответ

1 голос
/ 25 июня 2009

has_many, скорее всего, не будет работать, потому что он оценивается в теле класса, и ожидаемые внешние ключи относятся к классу, в котором он был оценен, а не к наследующим классам. (например, модель блога с id = 42 может иметь много моделей комментариев, сохраненных с blog_id = 42, ключи, необходимые для ее работы, основаны на имени класса)

Названная область должна работать, если она правильная.

Унаследованный метод должен работать.

...