我遇到了一个关于如何识别哪个用户拥有特定资源的问题,以便我可以阻止对他们的不当访问。
我有以下嵌套关联:
用户有很多 个人资料有一个 SamplePage有很多 受试者
一旦它们嵌套深度,通过关联访问用户对象变得非常笨拙,然后将其与当前用户进行比较,例如:
@subject.sample_page.profile.user == current_user
我已经读过限制访问的更好方法是将模型的检索范围限定为当前用户。 e.g:
@profile = current_user.profiles.find(params[:id])
这对我来说很有意义,但是我怎么做类似的事情让主题回来?我没有找到任何使用嵌套关联的例子。
答案 0 :(得分:1)
不确定你想要做什么,并且不确定我能帮助你,因为我是一个巨大的菜鸟,但我会尝试这样的事情(假设current_user返回一个用户):
class Profile < ActiveRecord::Base
has_many :subjects, :through => :sample_pages
end
并在您的控制器中:
@subject = current_user.profiles.subjects.find(params[:id])
用这种方式更方便:
class User < ActiveRecord::Base
def subjects
profiles.subjects
end
end
@subject = current_user.subjects.find(params[:id])
所有这些都应该是延迟加载的,如下所述:http://asciicasts.com/episodes/202-active-record-queries-in-rails-3
然而,如果它是一个频繁的操作,你可能想要重新设计一些东西,因为很长的关联链意味着大量的查询(很多连接)。