[英]Tableless model with ActiveRecord associations in Rails 3.2
我的應用程序配置包括一些需要在AR關系中使用的值。 我知道這是一個奇怪的,可能是犯罪的嘗試,但我需要將配置保持為文本文件,老實說,我認為我有一個無表格模型的好例子。 不幸的是,我無法說服AR(Rails 3.2)不要尋找表格。 我的無表款式:
class Tableless < ActiveRecord::Base
def self.table_name
self.name.tableize
end
def self.columns
@columns ||= [];
end
def self.column(name, sql_type = nil, default = nil, null = true)
columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type.to_s, null)
end
def self.columns_hash
@columns_hash ||= Hash[columns.map { |column| [column.name, column] }]
end
def self.column_names
@column_names ||= columns.map { |column| column.name }
end
def self.column_defaults
@column_defaults ||= columns.map { |column| [column.name, nil] }.inject({}) { |m, e| m[e[0]] = e[1]; m }
end
def self.descends_from_active_record?
return true
end
def persisted?
return false
end
def save( opts = {} )
options = { :validate => true }.merge(opts)
options[:validate] ? valid? : true
end
end
這是由實際模型擴展:
class Stuff < Tableless
has_many :stuff_things
has_many :things, :through => :stuff_things
column :id, :integer
column :name, :string
column :value, :string
def initialize(attributes = {})
attributes.each do |name, value|
send("#{name}=", value)
end
end
end
對於Rails> = 3.2,有activerecord-tableless gem。 它是創建無表格ActiveRecord模型的寶石,因此它支持驗證,關聯,類型。
當您使用推薦的方式(使用與ActiveRecord相對的ActiveModel)在Rails 3.x中執行此操作時,不支持關聯或類型。
對於Rails> = 4,您還可以通過定義像這樣的無表格類來獲得對驗證,關聯和一些回調(如after_initialize)的支持:
class Tableless < ActiveRecord::Base
def self.columns() @columns ||= []; end
def self.column(name, sql_type = nil, default = nil, null = true)
columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type.to_s, null)
end
attr_accessor :id, :name, :value
has_many :stuff_things
has_many :things, :through => :stuff_things
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.