gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 01:18:59 27 4
gpt4 key购买 nike

我对 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

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

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

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 问题做那件事:)

关于mysql - Ruby On Rails 中的数据库和模型设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4046424/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com