0

我正在尝试创建一个 Rails 应用程序,根据您的用户类型为不同的表格提供服务,假设您负责库存,因此该应用程序会向您显示与库存相关的表格,问题是我没有事先不知道会有哪些类型的用户,所以我需要一个通用 的方法来解决这个问题。

我的实际用户模型如下所示:

# == Schema Information
#
# Table name: users
#
#  id              :integer         not null, primary key
#  created_at      :datetime        not null
#  updated_at      :datetime        not null
#  password_digest :string(255)
#  remember_token  :string(255)
#  username        :string(255)
#  id_compania     :string(255)
#  type            :integer
#  name            :string(255)
#  admin           :boolean         default(FALSE)
#  empresa_id      :integer         default(1), not null
#

class User < ActiveRecord::Base
  attr_accessible :id_compania, :username, :type, :password, :password_confirmation, :name, :empresa_id
  has_secure_password
  belongs_to :empresa

  before_save { |user| user.username = username.downcase }
  before_save :create_remember_token
  USERNAME_REGEX = /(^([a-z]{3})-([a-z\d]){5,}$)/

  validates :username, `enter code here`presence: true, length: { maximum: 15 }, format: { with: USERNAME_REGEX }
  validates :password, presence: true, length: { minimum: 8 }
  validates :password_confirmation, presence: true
  validates :type, presence: true, length: { maximum: 4 }
  validates :id_compania, presence: true, length: { maximum: 3 }


  private

    def create_remember_token
      self.remember_token = SecureRandom.urlsafe_base64
    end

end
4

2 回答 2

0

所以看起来你有一个为用户定义的 :type 。如果是这种情况,那么您可以定义一个根据您感兴趣的用户类型返回某些表的方法。例如,

def return_tables(usertype)
  if (usertype=="Admin")
    @tables =.....(some way to retrieve the columns you want)
  else
  :
  end
end

你可以通过以下方式调用它:

return_tables(user.type)
于 2012-07-20T22:58:04.947 回答
0

我会为此使用单表继承。您需要对架构进行的唯一更改是对类型字段使用字符串而不是整数。有人为 Rails 指南编写了STI指南,但由于某种原因从未完成。不过,您应该能够从中获得足够的收益,并且 stackoverflow 对此主题有一些很好的问题和答案。

随着列的变化,您将需要创建 User 模型的不同子类:

User < ActiveRecord::Base
end

InventoryUser < User
  def tables
    # your logic
  end
end

AdminUser < User
  def tables
    # your logic
  end
end
于 2012-07-21T00:58:18.377 回答