[英]How to make work single table inheritance and attr_accessible?
在rails應用程序中,我有一個這樣的基本模型:
class User < ActiveRecord::Base
attr_accessible :email, :name
end
和這個模型的繼承,像這樣:
class Provider < User
belongs_to :user
attr_accessible :business_name, :contact_name, :business_phone_number,
:business_email, :website, :user_id
end
當我做 :
Provider.new.user_id
它說NoMethodError: undefined method 'user_id' for #<Provider:0x007f63ec8b3790>
。
當我剛做Provider.new
我有這個:
#<Provider id: nil, name: nil, email: nil, created_at: nil, updated_at: nil, type: "Provider">
這是我的schema.rb的一部分:
create_table "providers", :force => true do |t|
t.string "business_name", :null => false
t.string "contact_name", :null => false
t.string "business_phone_number", :null => false
t.string "business_email", :null => false
t.string "website"
t.integer "user_id"
end
create_table "users", :force => true do |t|
t.string "name"
t.string "email"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
如您所見,無法訪問Provider的可訪問屬性。 你有解決方案嗎?
謝謝!
正如單表繼承的答案中所討論的,它引用具有自己字段的子類 , ActiveRecord
的單表繼承實現不涉及其他表。 所有子類共享同一個表,並依賴type
字段來標識子類。 這就解釋了為什么您的Provider
實例只包含users
表中可用的字段,包括Rails為子類支持添加的type
字段。 您的providers
表未使用。
在數據庫級別使用相同的表。 通過向現有表添加新列來實現STI。 通常名為“type”的新列用於保存信息,無論是“提供者”還是“用戶”
以下是模型查詢轉換為sql查詢的方式
查詢用戶模型時,根據您的示例,它會搜索“用戶”表並包含條件中的所有可用類型值
> User.first
SELECT `users`.* FROM `users` WHERE `users`.`type` IN ('User', 'Provider') ORDER BY `users`.`id` ASC LIMIT 1
查詢提供者模型時,在條件中將類型設置為“提供者”,因此結果將被過濾。 底層數據庫表保持不變即“用戶”
> Provider.first
SELECT `users`.* FROM `users` WHERE `users`.`type` IN ('Provider') ORDER BY `users`.`id` ASC LIMIT 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.