我对Ruby中的数据库设置很陌生,需要帮助才能与模型一起正确设置它。有人可以帮忙吗?
基本上我有一个组织,它至少有两种类型的用户 - 会员和管理员用户。组织和用户都有一个地址。
我认为这基本上是三个表 - 组织,用户和地址,但在尝试考虑模型和外键时却非常困惑。
有人能建议最好的方法来组织这个吗?
我正在使用mySql数据库运行Rails 3。
感谢您的时间
嗅探者
答案 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的帖子。
希望这会帮助你!