开发者

Modify the behavior of has_many or use scope?

开发者 https://www.devze.com 2023-03-30 10:41 出处:网络
I have a class that looks something like this: class User < ActiveRecord:Base has_many :users_companies

I have a class that looks something like this:

class User < ActiveRecord:Base
  has_many :users_companies
  has_many :companies, :through => :users_companies
end

For plain users, I'd like user.companies to refer to the standard association method, but when a user is an admin, I want User.all (i.e., admins have access to all companies). The simplest way I can think of to implement this (and what I've always done in the past) is use a scope on the Company class, such as:

scope :accessible_by, lambda { |user| ... }

The only problem is that this just doesn't feel right. Instead of writing a c开发者_Go百科ontroller action that includes:

  @companies = Company.accessible_by(current_user)

I'd feel more comfortable writing

  @companies = current_user.companies

Is there a good way to override the User#companies method to accommodate this kind of behavior? Or, should I be happy with using a scope on Company?


I'm wrestling with a similar problem. The only acceptable solution I can devise is an association extension, which overrides the query for admin users and passes normal users' queries, unmolested.

# this works for me in rails 3.1
class User < ActiveRecord:Base
  has_many :users_companies
  has_many :companies, :through => :users_companies do
    def visible
      if proxy_association.owner.admin?
        UsersCompany.scoped
      else
        self
      end
    end
  end
end

User.where(:admin => true).first.companies.visible == UsersCompany.all


I'm fairly new to Rails, but this is an interesting question so I figured I'd toss in my two cents. It seems that you should be able to extend your association in User with a companies method that checks self.is_admin? (or similar) and returns what you need. See http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_many#461-User-a-block-to-extend-your-associations


Nice question. I was wondering if something like the following is an option you would consider

class User < ActiveRecord:Base
  has_many :users_companies
  has_many :companies, :through => :users_companies

  def viewable_companies
     admin? ? Company.all : self.companies
  end
end

I know the naming is horrible but, you know, naming things is serious stuff :)

0

精彩评论

暂无评论...
验证码 换一张
取 消