Ruby on Rails模型中的正确方法

时间:2014-06-19 19:04:57

标签: ruby-on-rails rails-activerecord has-and-belongs-to-many

我的Rails模型有一些不好的线条。通常,第一个错误是从roles def访问has_access变量时。然后,第二个是where行动。

class Organization < ActiveRecord::Base

  has_and_belongs_to_many :organizations_users
  belongs_to :user

  validates :name, :presence => true, :length => { minimum: 4, maximum: 35 }, uniqueness: true
  roles = { :administrator => 1, :support => 2 }

  def has_access(chosen_user, role)
      self.organizations_users.where('user_id = ? and role = ?', chosen_user.id, roles[role]).exists?
  end

  def add_user(chosen_user, role)
      if !self.has_access(chosen_user, role)
          self.organizations_users.create({user_id: chosen_user.id, role: roles[role]})
      end
      has_access(chosen_user,role)
  end

end

我还需要查询organizations_users表以获取有关访问的信息。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

要查找或添加组织,请执行以下操作:

def has_access(role)
  self.organizations_user.find_or_create_by_role(role)
end

这允许您使用:

user = User.has_access("administrator")

user = User.first.has_acess("administrator")

并且会在表user_organizations中进行查找,或者如果找不到,则创建一个新条目。 ActiveRecord关系将处理user_id

答案 1 :(得分:0)

最简单的解决方法是改变

def has_access(chosen_user, role)
  where('user_id = ? and role = ?', chosen_user.id, roles[role]).exists?
end

为:

def has_access(chosen_user, role)
  Organization.where('user_id = ? and role = ?', chosen_user.id, roles[role]).exists?
end

这样做的原因是where()方法是一个类方法,只能从类本身IE中访问。 Organization.where。顺便说一下,我假设(危险:) :)这个where子句是从组织中使用的。