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

时间:2010-10-28 19:18:27

标签: mysql ruby-on-rails model

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

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

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

有人能建议最好的方法来组织这个吗?

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

感谢您的时间

嗅探者

2 个答案:

答案 0 :(得分:5)

我非常喜欢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/

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

<强>更新

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

与往常一样,测试驱动开发是最好的,但我通常没有时间为stackoverflow问题做到这一点:)

答案 1 :(得分:2)

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

我已经删除了管理员关联,部分原因是因为它无论如何都没有用,主要是因为Jaime说这是错误的方式(大多数开发人员使用某种角色系统)。有关创建可扩展角色系统的好方法,请参阅Jaime的帖子。

希望这会帮助你!