你可能想看看單表繼承
嘗試Developer
和Driver
,無論從User
繼承和共享一個users
數據庫表。每個實際上都是它自己的模型,允許你定義完全獨立的關聯,回調,驗證,實例方法等......
它們共享所有相同的數據庫列,並且User
類中定義的任何內容都將被繼承並可以被覆蓋)。您需要將type
列添加到users
。所有的Developer
和Driver
列字段也應該爲users
表定義。
class AddTypeColumnToUsers < ActiveRecord::Migration
def change
add_column :users, :type, :string
end
end
而且你的模型
class User < ApplicationRecord
end
class Driver < User
end
class Developer < User
end
Driver.new.type # => "Driver"
Developer.new.type # => "Developer"
User.new.type # => nil
User.new(type: 'Driver').class # => Driver
User.new(type: 'Developer').class # => Developer
User.new.class # => User
你可以就像你其他型號
Developer.all # queries all users WHERE type="Developer"
Driver.all # queries all users WHERE type="Driver"
User.all # queries all users no matter what type
寫您的關聯就像你與其他型號運行它們單獨的查詢, ActiveRecord會處理所有其他事情。
class Company < ApplicationRecord
has_many :users
has_many :developers
has_many :drivers
end
class User < ApplicationRecord
belongs_to :company
end
class Driver < User
belongs_to :company
end
class Developer < User
belongs_to :company
end
c = Company.first
c.developers # => All developers that belong to the Company
c.drivers # => All drivers that belong to the Company
c.users # => All users (including developers and drivers) that belong to the Company
您還可以使用enum
爲type
列,覆蓋默認type
列名,如果你想
class AddTypeColumnToUsers < ActiveRecord::Migration
def change
add_column :users, :role, :integer
end
end
class User < ApplicationRecord
self.inheritance_column = :role # This overrides the the "type" column name default
enum role: { Driver: 0, Developer: 1 }
end
class Driver < User
end
class Developer < User
end
美中不足的使用enum
是你將不得不使用大寫名稱,你所有的enum
輔助方法和範圍也將被大寫。
User.Driver # => Scope that returns all drivers
Driver.all # => same as User.Driver
User.first.Driver? # => Is the user a Driver?
http://api.rubyonrails.org/classes/ActiveRecord/Inheritance.html
http://siawyoung.com/coding/ruby/rails/single-table-inheritance-in-rails-4.html
您可以輕鬆地使用'enum'單表繼承適應當前的角色。 –