【问题标题】:Creating a scope based off of a relation根据关系创建范围
【发布时间】:2011-02-22 18:13:09
【问题描述】:

我正在使用 Rails 3.0.4 和 Ruby 1.9.2

我正在尝试创建一个名为 role 的范围,它接受一个角色字符串并返回所有以 role 作为其角色之一的 User 记录。

问题是UserRole 有HABTM 关系,我真的不知道如何在常规User.where() 语句中访问这些信息。

这就是我的想法:

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

(role? 是我编写的一个方法,它只检查用户是否属于该角色)

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

谢谢。

【问题讨论】:

  • 角色是一个单独的模型,还是只是用户表中的一个字段?
  • 它是一个单独的模型,具有 Has 和属于 Many 关系。

标签: ruby-on-rails ruby scope relationship


【解决方案1】:

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

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

如果角色是一个单独的模型和User belongs_to :role。 Role 也有 title 字段:

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("会员")

或使用范围:

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

【讨论】:

  • 你传递了什么论点?角色.title?角色名称?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
相关资源
最近更新 更多