繁体   English   中英

Ruby On Rails中的数据库和模型设置

[英]Database and model setup in Ruby On Rails

我对Ruby中的数据库设置还很陌生,需要帮助来正确地与模型一起设置它。 有人可以帮忙吗?

基本上,我有一个组织,它将至少有两种类型的用户-成员和管理员用户。 组织和用户都有地址。

我当时以为这基本上是三个表-组织,用户和地址,但是在考虑模型和外键时却感到非常困惑。

谁能建议最好的组织方式?

我正在使用MySql数据库运行Rails 3。

谢谢你的时间

嗅探器

我很喜欢亚当·坦纳(Adam Tanner)的回答,但是我会做一些不同的设置。 首先,组织与管理员的关联方式无法按所述方式工作-您必须在用户表中使用其他外键,并在has_one :admin关联中进行指定。 但是无论如何我都不认为这是一个好方法,因为它将您限制为每个组织一名管理员,并且限制了一个组织内的用户。

我的版本稍微复杂一些,但我认为它可以很好地完成工作。 首先,管理员应该是用户在组织中拥有或没有的角色。 我将首先解决用户/组织问题,并保存地址问题供以后使用。

以下是迁移,您可以使用它们所需的其他任何字段来增强它们:

create_table :organizations do |t|
  # your fields go here
end

create_table :users do |t|
  # your fields go here
end

create_table :memberships do |t|
  t.integer :user_id
  t.integer :organization_id
  t.boolean :is_admin
end

add_index :memberships, [:user_id, :organization_id]

如您所见,我们正在添加一个成员关系表,该表将连接用户和组织。 我们还添加了索引,以加快关联速度。 现在为模型:

class Organization < ActiveRecord::Base
  has_many :memberships
  has_many :users, :through => :memberships
end

class User < ActiveRecord::Base
  has_many :memberships
  has_many :organizations, :through => :memberships

  def membership_in organization
    self.memberships.detect{|m| m.organization = organization}
  end

  def is_admin_for? organization
    self.membership_in(organization).is_admin?
  end

  def set_admin_for organization, value
   self.membership_in(organization).update_attribute(:is_admin, value)
  end
end

class Membership < ActiveRecord::Base
  belongs_to :organization
  belongs_to :user
end

在这里,我们通过成员身份连接我们的用户和组织。 用户可以是他们所属的任何组织的管理员。 我创建了一些方法来设置和获取用户模型中组织中用户的管理员状态。

接下来的地址:我已经在我的博客文章中解决了这个问题:

http://kconrails.com/2010/10/19/common-addresses-using-polymorphism-and-nested-attributes-in-rails/

如果您有任何问题,请询问。 祝好运!

UPDATE

爱德华·史密斯(Edward M. Smith)在评论中指出,我的管理方法不是非常容错的。 在本例中,我试图使代码尽可能保持整洁,但是他有一点要注意。 因此,以下是更强大的版本,它说明了尝试使用用户属于的组织中的成员身份:

  def is_admin_for? organization
    membership = self.membership_in(organization)
    return false if membership.nil?

    membership.is_admin?
  end

  def set_admin_for organization, value
    membership = self.membership_in(organization)
    return false if membership.nil?

   membership.update_attribute(:is_admin, value)
  end

和往常一样,测试驱动的开发是最好的,但是对于堆栈溢出问题,我通常没有时间这样做:)

class Organization < ActiveRecord::Base
  has_one :address, :as => :addressable
  has_many :members, :class_name => "User"
end

 class User < ActiveRecord::Base
   has_one :address, :as => :addressable
   belongs_to :organization
 end

 class Address < ActiveRecord::Base
   belongs_to :addressable, :polymorphic => true
 end

我删除了admin关联,部分是因为它无论如何都无法正常工作,主要是因为Jaime表示这是错误的处理方式(大多数开发人员都使用某种角色系统)。 有关创建可扩展角色系统的好方法,请参见Jaime的文章。

希望这可以帮助你!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM