簡體   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