Rails Has_many 上的枚举问题,through...method cannot be called from my controller
Rails Enum issue on Has_many, through...method cannot be called from my controller
我有一个关系模型,我在其中建立了用户和项目之间的以下关系。在这个关系模型中我使用枚举来区分用户与项目的关系类型(基本上建立一个"role")。
现在在我的项目控制器中,我正在尝试调用项目管理员操作
def projectadmins
@title = "Project Admins"
@project = Project.find(params[:id])
authorize @project, :visit?
@projects = @project.followers
render 'show_projectadmin_project'
rescue Pundit::NotAuthorizedError
flash[:danger] = "You are not authorized to access this page."
redirect_to projects_path || root_path
end
我的关系模型是:
class Relationship < ActiveRecord::Base
belongs_to :follower, class_name: "User"
belongs_to :followed, class_name: "Project"
validates :follower_id, presence: true
validates :followed_id, presence: true
enum role: [:admin, :collaborator, :visitor]
end
用户和项目模型:
class User < ActiveRecord::Base
has_many :own_projects, :class_name=>'Project'
has_many :projects
has_many :relationships, foreign_key: "follower_id", dependent: :destroy
has_many :followed_projects, through: :relationships, source: :followed
end
class Project < ActiveRecord::Base
belongs_to :owner, :foreign_key=>'user_id', :class_name=>'User'
has_many :reverse_relationships, foreign_key: "followed_id",
class_name: "Relationship",
dependent: :destroy
has_many :followers, through: :reverse_relationships, source: :follower
end
'show_projectadmin_project' 视图:
<h3>Project Administrators</h3>
<% if @project.projectadmins.any? %>
<% @project.projectadmins.each do |user| %>
<div class="no-pad col-md-3">
<div class="inner-border">
<h5><%= link_to user.email, user %></h5>
</div>
</div>
<% end %>
<% end %>
照原样,我在控制器方法中的代码设置为 return all 以下关系 ("@projects = @project.followers").. .我的问题是如何将这行代码更改为 return 所有以下具有 :admin 枚举角色类型的关系?
我假设类似“@projects = @project.followers where (etc, etc)”但我似乎找不到任何对我有用的东西。
更新:我不想必须这样做,因为我认为添加枚举角色类型会阻止我在模型中设置不同的 has_many。我只想使用追随者关系并能够以某种方式区分枚举类型,但是...
我已尝试将以下内容添加到我的项目模型中:
has_many :projectadmins, -> { where role: :admin}, class_name: 'Relationship', through: :reverse_relationships, source: :follower
并在我的控制器中调用以下行而不是“.followers”
@projects = @project.projectadmins
现在操作 'projectadmins' 起作用了,我得到了正确的视图(我想这是一个好兆头)...但是项目管理员没有按应有的方式列出。
只是为了跟进这个...我只需要将模型中的行更改为:
has_many :projectadmins, -> { where("relationships.role = ?", Relationship.roles[:admin]) }, through: :reverse_relationships, source: :follower
它起作用了...以防万一对其他人有帮助。
我有一个关系模型,我在其中建立了用户和项目之间的以下关系。在这个关系模型中我使用枚举来区分用户与项目的关系类型(基本上建立一个"role")。
现在在我的项目控制器中,我正在尝试调用项目管理员操作
def projectadmins
@title = "Project Admins"
@project = Project.find(params[:id])
authorize @project, :visit?
@projects = @project.followers
render 'show_projectadmin_project'
rescue Pundit::NotAuthorizedError
flash[:danger] = "You are not authorized to access this page."
redirect_to projects_path || root_path
end
我的关系模型是:
class Relationship < ActiveRecord::Base
belongs_to :follower, class_name: "User"
belongs_to :followed, class_name: "Project"
validates :follower_id, presence: true
validates :followed_id, presence: true
enum role: [:admin, :collaborator, :visitor]
end
用户和项目模型:
class User < ActiveRecord::Base
has_many :own_projects, :class_name=>'Project'
has_many :projects
has_many :relationships, foreign_key: "follower_id", dependent: :destroy
has_many :followed_projects, through: :relationships, source: :followed
end
class Project < ActiveRecord::Base
belongs_to :owner, :foreign_key=>'user_id', :class_name=>'User'
has_many :reverse_relationships, foreign_key: "followed_id",
class_name: "Relationship",
dependent: :destroy
has_many :followers, through: :reverse_relationships, source: :follower
end
'show_projectadmin_project' 视图:
<h3>Project Administrators</h3>
<% if @project.projectadmins.any? %>
<% @project.projectadmins.each do |user| %>
<div class="no-pad col-md-3">
<div class="inner-border">
<h5><%= link_to user.email, user %></h5>
</div>
</div>
<% end %>
<% end %>
照原样,我在控制器方法中的代码设置为 return all 以下关系 ("@projects = @project.followers").. .我的问题是如何将这行代码更改为 return 所有以下具有 :admin 枚举角色类型的关系?
我假设类似“@projects = @project.followers where (etc, etc)”但我似乎找不到任何对我有用的东西。
更新:我不想必须这样做,因为我认为添加枚举角色类型会阻止我在模型中设置不同的 has_many。我只想使用追随者关系并能够以某种方式区分枚举类型,但是...
我已尝试将以下内容添加到我的项目模型中:
has_many :projectadmins, -> { where role: :admin}, class_name: 'Relationship', through: :reverse_relationships, source: :follower
并在我的控制器中调用以下行而不是“.followers”
@projects = @project.projectadmins
现在操作 'projectadmins' 起作用了,我得到了正确的视图(我想这是一个好兆头)...但是项目管理员没有按应有的方式列出。
只是为了跟进这个...我只需要将模型中的行更改为:
has_many :projectadmins, -> { where("relationships.role = ?", Relationship.roles[:admin]) }, through: :reverse_relationships, source: :follower
它起作用了...以防万一对其他人有帮助。