簡體   English   中英

如何使單表繼承和attr_accessible工作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM