难以用文字描述,我宁愿向您展示代码并进行解释。现在我可以告诉你,我正在用类似UNIX的版权系统编写应用程序而且我遇到了一个问题,我还不知道如何解决。以下是我的关系模型。
class Document < ActiveRecord::Base
attr_accessible :name, :rights
belongs_to :folder
validates :folder_id, presence: true
end
class Folder < ActiveRecord::Base
attr_accessible :name, :rights
belongs_to :user
has_many :documents, dependent: :destroy
validates :name, presence: true
validates :user_id, presence: true
end
class User < ActiveRecord::Base
attr_accessible :name, :email, :password, :password_confirmation, :user_id
has_many :folders
has_many :group_users
has_many :groups, :through => :group_users
end
class Group < ActiveRecord::Base
attr_accessible :name, :owner
has_many :group_users
has_many :users, :through => :group_users, dependent: :destroy
end
class GroupUser < ActiveRecord::Base
attr_accessible :group_id, :user_id
belongs_to :user
belongs_to :group
end
考虑到我的系统,组中的每个用户都应该可以访问组所有者拥有的所有文件夹(而不是立即获取帐户权限)。这就是我尝试列出所有文件夹的方式,用户可以访问。
在文件夹控制器中
def list_folders
@user_groups = current_user.groups
end
在list_folder视图中
<table class="table table-striped">
<tr>
<td>Folder name</td>
<td>Documents</td>
<td>Actions</td>
</tr>
<% for group in @user_groups %>
<% user = User.find(group.owner)%>
<% folders = user.folders %>
<% for folder in folders %>
<tr>
<td><%= folder.name %></td>
<td>#</td>
<td><%= link_to 'view', folder_path(folder.id) %></td>
<tr>
<% end%>
<% end %>
</table>
所以问题在于现在的代码,如果用户自己拥有一个组,他的文件夹也会被提取。而且我不希望这种情况发生,因为我有其他地方可以观看和编辑用户拥有的文件夹。在这里,我只想带来他从其他团体那里得到的东西。我试图以某种方式将他排除在查询之外,但没有成功。然后我试图将他从@user_groups数组中删除,但它也没有按照我想要的方式运行。我对这个问题的任何建议持开放态度,如果可能的话,我想得到一些关于如何在视图中重写代码的提示,因为迭代器中的迭代器(或循环?)看起来很麻烦。
答案 0 :(得分:0)
您可以尝试设置命名范围并通过该范围进行检索。
http://guides.rubyonrails.org/active_record_querying.html#scopes