关联表少模型

时间:2014-01-28 11:43:32

标签: activerecord ruby-on-rails-4 associations

我一直在尝试在FrontEnd上实现关联,但是目前应用程序没有任何数据库直接与网站连接,因此我们无法使用ActiveRecord并且只使用ActiveModel来支持验证和模型的核心特征。现在我们需要使用我们将要与对象一起发送的嵌套属性,与User关联的地址,因此我们需要首先在相应的模型上定义关联。但是在定义关联之后,它会在用户模型上抛出未定义方法“has_many”的异常。我正在寻找在我们的网站上实现它的方法,并实现嵌套属性的逻辑。 如果您可以向我推荐任何与此相关的内容,或者您​​过去遇到过这样的问题,那就太棒了 我也尝试过使用gem https://github.com/softace/activerecord-tableless的方法但不适合我。我还添加了一个tableless.rb

tableless.rb

class Tableless < ActiveRecord::Base     
  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()
    @columns ||= [];
  end

  def self.columns_hash
    h = {}
    for c in self.columns
    h[c.name] = c
    end
    return h
  end

  def self.column_defaults
    Hash[self.columns.map{ |col|
    [col.name, col.default]
    }]
  end
  def self.descends_from_active_record?
    return true
  end
  def persisted?
    return false
  end
# override the save method to prevent exceptions
end

但是获得以下异常异常:

控制台错误:

ActiveRecord::ConnectionNotEstablished: ActiveRecord::ConnectionNotEstablished
    from /home/cis/.rvm/gems/ruby-2.0.0-p0@website/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:546:in `retrieve_connection'
    from /home/cis/.rvm/gems/ruby-2.0.0-p0@website/gems/activerecord-4.0.0/lib/active_record/connection_handling.rb:79:in `retrieve_connection'
    from /home/cis/.rvm/gems/ruby-2.0.0-p0@website/gems/activerecord-4.0.0/lib/active_record/connection_handling.rb:53:in `connection'
    from /home/cis/.rvm/gems/ruby-2.0.0-p0@website/gems/activerecord-4.0.0/lib/active_record/model_schema.rb:203:in `table_exists?'
    from /home/cis/.rvm/gems/ruby-2.0.0-p0@website/gems/activerecord-4.0.0/lib/active_record/attribute_methods/primary_key.rb:92:in `get_primary_key'
    from /home/cis/.rvm/gems/ruby-2.0.0-p0@website/gems/activerecord-4.0.0/lib/active_record/attribute_methods/primary_key.rb:77:in `reset_primary_key'
    from /home/cis/.rvm/gems/ruby-2.0.0-p0@website/gems/activerecord-4.0.0/lib/active_record/attribute_methods/primary_key.rb:65:in `primary_key'
    from /home/cis/.rvm/gems/ruby-2.0.0-p0@website/gems/activerecord-4.0.0/lib/active_record/attribute_methods/primary_key.rb:79:in `reset_primary_key'
    from /home/cis/.rvm/gems/ruby-2.0.0-p0@website/gems/activerecord-4.0.0/lib/active_record/attribute_methods/primary_key.rb:65:in `primary_key'
    from /home/cis/.rvm/gems/ruby-2.0.0-p0@website/gems/activerecord-4.0.0/lib/active_record/attribute_methods/write.rb:32:in `write_attribute'
    from /home/cis/.rvm/gems/ruby-2.0.0-p0@website/gems/activerecord-4.0.0/lib/active_record/attribute_methods/dirty.rb:70:in `write_attribute'
    from /home/cis/.rvm/gems/ruby-2.0.0-p0@website/gems/activerecord-4.0.0/lib/active_record/attribute_methods/write.rb:19:in `__temp__9646='
    from /home/cis/API_OTGJ/Tableless/app/models/book.rb:13:in `block in initialize'
    from /home/cis/API_OTGJ/Tableless/app/models/book.rb:12:in `each'
    from /home/cis/API_OTGJ/Tableless/app/models/book.rb:12:in `initialize'
    from /home/cis/.rvm/gems/ruby-2.0.0-p0@website/gems/activerecord-4.0.0/lib/active_record/inheritance.rb:27:in `new'
    from /home/cis/.rvm/gems/ruby-2.0.0-p0@website/gems/activerecord-4.0.0/lib/active_record/inheritance.rb:27:in `new'
    from (irb):19
    from /home/cis/.rvm/gems/ruby-2.0.0-p0@website/gems/railties-4.0.0/lib/rails/commands/console.rb:90:in `start'
    from /home/cis/.rvm/gems/ruby-2.0.0-p0@website/gems/railties-4.0.0/lib/rails/commands/console.rb:9:in `start'
    from /home/cis/.rvm/gems/ruby-2.0.0-p0@website/gems/railties-4.0.0/lib/rails/commands.rb:64:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4:in `<main>'

1 个答案:

答案 0 :(得分:1)

您似乎忘了调用方法

has_no_table

在您的模型上,按照https://github.com/softace/activerecord-tableless#usage。在他们的例子中:

class ContactMessage < ActiveRecord::Base
  has_no_table
  column :name, :string
  column :email, :string
  validates_presence_of :name, :email
end

希望这会有所帮助。 =)