动态设置基于current_user的named_scope

时间:2010-01-26 22:58:38

标签: ruby-on-rails dynamic model controller named-scope

我一直收到以下错误:

  

当你没有时,你有一个零对象   期待它!你可能已经预料到了   数组的实例。发生错误   同时评估nil.size

根据当前用户,当他们导航到某个页面时,我想根据他们的网站将其限制为他们可以看到的内容。问题是站点和用户表之间没有直接关联。联系人has_one用户(用户信息存储在current_user变量中)。一个网站有很多联系人。还有一个网站有很多学生,其中学生表有一个site_id的外键。因此,学生和网站之间存在链接,因此当前用户导航到学生页面时,他们只能看到来自同一网站的学生。我可以通过在named_scope中对数字进行硬编码来仅显示current_user站点的学生。但是不同的用户将属于不同的站点,因此在登录时,与其关联的站点将发生变化。这就是问题 - 在named_scope中动态设置该值。这就是我所拥有的:

StudentsController

def index_scoper
  if current_user.role_id == 8
    super.site_staff_limit while current_user[:site_id]
    # The problem is the user table has no site_id. There is no direct
    # link between the users table and sites table. However, there is
    # a link between users and contacts and then site and contacts and
    # then site and students, where students table has site_id.
  else
    super.with_state.with_site
  end
end

学生模特

named_scope :site_staff_limit, lambda {|site_id| {:conditions => {:site_id => site_id}}}

感谢您的任何建议。

表之间的关系:

用户:contact_id 联系人:主键,contactable_id,contactable_type site:主键 学生:site_id

用户模型 belongs_to:联系

联系型号 has_one:user belongs_to:contactable,:polymorphic => true,:dependent => :破坏

网站模型  has_many:contacts,:as => :接触 has_many:学生

学生模特 belongs_to:site

这成功地限制了学生的网站: StudentsController def index_scoper   if current_user.role_id == 8     super.site_staff_limit   其他     super.with_state.with_site   结束 端

学生模特 named_scope:site_staff_limit,:conditions => {:site_id => 1}

问题是不同的用户将属于不同的网站,因此他们只能访问他们所属网站的学生记录。我很难让named_scope在动态上足以实现这一目标。

1 个答案:

答案 0 :(得分:1)

您可以使用:through关系在用户和网站之间建立链接。

您提供的代码是否有效? 是否出现错误?