Rails通过user_id定义范围模型数据

时间:2012-09-30 11:43:38

标签: ruby-on-rails

我有一个Rails应用程序,其中用户长时间进入,并且我在会话中拥有user_id。下一步是为显示给data.user_id = session[:user_id]的用户的所有模型数据创建范围。

我知道我可以在每个控制器中执行以下操作

Controller.find_all_by_user_id(session[:user_id])

但对我而言,似乎可能有更好的解决方案。我发现有可能在模型中添加一个范围,但是这里的会话并不知道,并且MVC模式明智地将它放在那里可能不是一个好主意。是否有解决方案将这样的user_id限制应用于来自模型的所有数据,或者我是否只对每个具有userdata的控制器函数使用find_all_by_user_id

2 个答案:

答案 0 :(得分:3)

如果我理解正确,您希望user_id访问某些数据。这意味着您可以将用户模型中的关系定义为has_many :this_and_that或类似的东西。它是正确的,然后您可以在应用程序控制器中创建一个before_filter甚至更好的函数,在该控制器中获取当前用户实例。通过此实例,您可以访问该用户的所有可用数据。您甚至可以将该函数作为辅助函数,并且可以在视图中使用它。

#User.erb
has_many :other_data

#ApplicationConroller.erb
def current_user
  @current_user ||= User.find_by_id(session[:user_id])
end

#OtherControllers
def index
  @other_datas = current_user.other_datas
end

答案 1 :(得分:1)

你可以拥有before_filter :load_user_data, :if => current_user或类似的东西。 方法将如下所示:

def load_user_data  
 @data = ModelName.where(user_id: session[:user_id]) 
end

@data将为ActiveRecord::Relation,并且可以链接。如果你真的需要,也可以在每个控制器中使用find_all_by_user_id并不是那么糟糕。