基于关系创建范围

发布于 2024-10-18 09:31:25 字数 429 浏览 3 评论 0原文

我正在使用 Rails 3.0.4 和 Ruby 1.9.2

我正在尝试创建一个名为 role 的作用域,它接受角色字符串并返回所有具有 roleUser 记录code> 作为他们的角色之一。

问题是 UserRole 有 HABTM 关系,我真的不知道如何在常规 User.where()声明。

这就是我的想法:(

scope :role, lamda {|role| where {|user| user.role? role} }

角色?是我编写的一种方法,仅检查用户是否属于该角色)

有没有办法从哪里传递这样的用户对象?或者完成同样的事情的东西?

谢谢。

I'm using Rails 3.0.4 and Ruby 1.9.2

I'm trying to create a scope called role which takes a role string and returns all of the User records that have role as one of their roles.

The problem is User and Role have a HABTM relationship, and I don't really know how to access this information in a regular User.where() statement.

This is what I'm thinking:

scope :role, lamda {|role| where {|user| user.role? role} }

(role? is a method I wrote that just checks if a user belongs to that role)

Is there a way to pass the user object like that from where? Or something that accomplishes the same thing?

Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一杆小烟枪 2024-10-25 09:31:25

如果角色只是用户模型中的一个字段:

scope :with_role, lamda{|role_name| where(:role => role_name) }
User.with_role "Member"

如果角色是一个单独的模型并且User own_to :role。另外,角色有标题字段:

scope :with_role, lamda{|role_name| includes(:role).where(:roles => {:title => role_name}) }
User.with_role "Member" # the same usage

UPD 1

如果User has_many :roles,您应该使用用户模型方法:

class User < ActiveRecord::Base
  has_many :roles

  def self.with_role(role_name)
    Role.where(:name => role_name).first.users # hope title is validated uniq
  end
end

=> User.with_role("Member")

或使用范围:

scope :with_role, lambda{ |role| joins(:roles).where(:roles => {:name => role}) }

If role is just a field in user model:

scope :with_role, lamda{|role_name| where(:role => role_name) }
User.with_role "Member"

If role is a separate model and User belongs_to :role. Also Role has got title field:

scope :with_role, lamda{|role_name| includes(:role).where(:roles => {:title => role_name}) }
User.with_role "Member" # the same usage

UPD 1

If User has_many :roles you should use User model method:

class User < ActiveRecord::Base
  has_many :roles

  def self.with_role(role_name)
    Role.where(:name => role_name).first.users # hope title is validated uniq
  end
end

=> User.with_role("Member")

or using scope:

scope :with_role, lambda{ |role| joins(:roles).where(:roles => {:name => role}) }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文