【发布时间】:2009-03-04 07:52:11
【问题描述】:
我有一个 Rails 应用程序,其中用户拥有项目的成员资格(以及其他事物,多态)。用户也有角色。我希望 User#projects 像普通的 ActiveRecord 查找一样工作,但我也希望管理员能够访问每个项目。
我一直在这样做:
class User < ActiveRecord::Base
has_many :memberships, :dependent => :destroy
def projects
if has_role?(:admin)
Project.find(:all)
else
Project.find(:all, :include => :memberships, :conditions => ["memberships.user_id = ?", id])
end
end
end
class Project < ActiveRecord::Base
has_many :memberships, :as => :member, :dependent => :destroy
end
class Membership < ActiveRecord::Base
belongs_to :user
belongs_to :member, :polymorphic => :true
end
但我真的更愿意做这样的事情:
class User < ActiveRecord::Base
has_many :memberships, :dependent => :destroy
has_many :projects, :through => :memberships, :source => :member, :source_type => "Project"
end
这样我就可以更频繁地使用 named_scope(例如“alfred.projects.recent.active”)。
如果您自动为管理员添加新的会员资格,这很有效,但很快就会失控。
我想保留 User#projects 界面。这里的正确路线是什么?
非常感谢。
【问题讨论】:
-
感谢所有伟大的建议!可能有另一种方法来解决这个问题 - 是否有一种直接的方法可以使 ActiveRecord 对象数组的行为类似于 AR 关联,以便 named_scope 并找到工作?即项目 = Project.find(:all); projects.active.recent - 再次感谢大家!
标签: ruby-on-rails activerecord