我在想出执行以下操作的好方法时遇到问题。我有一个非常通用的组织模型和用户模型。组织 has_many :users
和 User own_to :org
。
我正在尝试找到一种显示不受组织限制的用户列表的方法,但也显示受组织限制的用户列表。我知道我可以嵌套路线,并且只有两条不同的路线,例如
map.resources :users
map.resources :orgs, :has_many => :users
问题是它们都返回到用户 Controller 中的相同操作。 Controller 代码开始变得非常困惑,因为我必须检查 :org_id 参数是否存在。然后我必须决定是返回对 User 的 find 调用的正常结果,还是返回范围限定为 Org 的 find 的结果。我不确定这里最好的解决方案是什么,或者最佳实践是什么。如果对此有一定了解的人可以赐教,那就太好了。
最佳答案
无需插件即可执行此操作的另一种方法是使用 named_scope 。您可以在 User 中创建一个命名范围,如果 org_id 不为空,则按 org_id 进行过滤。
class User < ActiveRecord::Base
belongs_to :org
named_scope :by_org, lambda{|org| org.blank? ? {} : { :conditions => ['org_id = ?', org] }}
end
在 Controller 中只需使用您的命名范围。这样,如果您最终在 Controller 中提供更多过滤器选项,则无需重复它们:
class UsersController < ApplicationController
def index
@users = User.by_org(params[:org_id]).all
...
end
end
关于ruby-on-rails - 使用相同的操作来显示所有(索引)对象,同时还显示由 url 参数限定范围的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/835342/