سؤال

جاء هذا قبل قليلا ( سمات نموذج القضبان دون عمود مقابلة في ديسيبل ) ولكن يبدو أن البرنامج المساعد القضبان المذكورة لا يتم الحفاظ عليه ( http://agilewebdevelopment.com/plugins/activerecord_base_without_table. ). لا توجد وسيلة للقيام بذلك مع activerecord كما هو؟

إذا لم يكن الأمر كذلك، فهل هناك أي طريقة للحصول على قواعد التحقق من صحة activerecord دون استخدام activerecord؟

يريد activerecord الجدول موجود، بالطبع.

هل كانت مفيدة؟

المحلول

هذا نهج استخدمته في الماضي:

في التطبيق / النماذج / مسند

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

  # Override the save method to prevent exceptions.
  def save(validate = true)
    validate ? valid? : true
  end
end

في التطبيق / النماذج / foo.rb

class Foo < Tableless
  column :bar, :string  
  validates_presence_of :bar
end

في البرنامج النصي / وحدة التحكم

Loading development environment (Rails 2.2.2)
>> foo = Foo.new
=> #<Foo bar: nil>
>> foo.valid?
=> false
>> foo.errors
=> #<ActiveRecord::Errors:0x235b270 @errors={"bar"=>["can't be blank"]}, @base=#<Foo bar: nil>>

نصائح أخرى

التحقق من الصحة هي ببساطة وحدة واحدة داخل activerecord. هل حاولت خلطها في نموذجك غير activerecord؟

class MyModel
  include ActiveRecord::Validations

  # ...
end

أبلغ الإجابات المزيدة كلما كان ذلك أفضل لأن هذه هي واحدة من النتائج الأولى في Google عند البحث عن "نماذج Rails 3.1 بدون طاولات"

لدي تنفذ نفس الشيء دون استخدام Activerecord :: Base أثناء تشمل التحقق من صحة activerecord ::

كان الهدف الرئيسي هو الحصول على كل شيء يعمل في Fromtastic، وتحت مدفوعات نموذجية لن يتم حفظها في أي مكان ولكن لا يزال لديه القدرة على التحقق من صحة التحقق من الصحة ونحن نعلم جميعا.

class Payment
  include ActiveModel::Validations
  attr_accessor :cc_number, :payment_type, :exp_mm, :exp_yy, :card_security, :first_name, :last_name, :address_1, :address_2, :city, :state, :zip_code, :home_telephone, :email, :new_record

  validates_presence_of :cc_number, :payment_type, :exp_mm, :exp_yy, :card_security, :first_name, :last_name, :address_1, :address_2, :city, :state

  def initialize(options = {})
    if options.blank?
      new_record = true
    else
      new_record = false
    end
    options.each do |key, value|
      method_object = self.method((key + "=").to_sym)
      method_object.call(value)
    end
  end

  def new_record?
    return new_record
  end

  def to_key
  end

  def persisted?
    return false
  end
end

آمل أن يساعد ذلك شخص ما لأنني قضيت بضع ساعات في محاولة لمعرفة ذلك اليوم.

تحديث: بالنسبة للقضبان 3، يمكن القيام بذلك سهلا للغاية. في القضبان 3+ يمكنك استخدام الجديد ActiveModel الوحدة ونقلها. هذا يجب أن يعمل الآن:

class Tableless
  include ActiveModel::Validations

  attr_accessor :name

  validates_presence_of :name
end

لمزيد من المعلومات، يمكنك التحقق من Railscast. (أو اقرأ عن ذلك على الأسيكاست) على الموضوع، وكذلك هذا وظيفة بلوق من يهودا كاتز.

الأجابة القديمة تتبع:

قد تحتاج إلى إضافة هذا إلى الحل، الذي اقترحه جون توبلي في التعليق السابق:

class Tableless

  class << self
    def table_name
      self.name.tableize
    end
  end

end

class Foo < Tableless; end
Foo.table_name # will return "foos"

هذا يوفر اسم جدول "وهمية"، إذا كنت بحاجة إلى واحدة. بدون هذه الطريقة، Foo::table_name سوف تقيم إلى "مسكرة الاهلى".

لقد وجدت هذا الرابط الذي يعمل بشكل جميل.

http://codetunes.com/2008/07/07/20/Tabless-Models-in-Rails/

مجرد إضافة إلى الإجابة المقبولة:

اجعل الفئات الفرعية الخاصة بك ترث الأعمدة الأصلية مع:

class FakeAR < ActiveRecord::Base
  def self.inherited(subclass)
    subclass.instance_variable_set("@columns", columns)
    super
  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

  # Overrides save to prevent exceptions.
  def save(validate = true)
    validate ? valid? : true
  end
end

هذا هو نموذج البحث الذي يقدم كائنا يسمى معايير التي لديها متداخلة فترة كائن مع بداية و نهاية صفات.

يعد الإجراء الموجود في وحدة التحكم بسيطة حقا، لكنه يقوم بتحميل القيم من الكائنات المتداخلة على النموذج وإعادة التخلي عن نفس القيم مع رسائل الخطأ إذا لزم الأمر.

يعمل على القضبان 3.1.

الموديل:

class Criteria < ActiveRecord::Base
  class << self

    def column_defaults
      {}
    end

    def column_names
      []
    end
  end # of class methods

  attr_reader :period

  def initialize values
    values ||= {}
    @period = Period.new values[:period] || {}
    super values
  end

  def period_attributes
    @period
  end
  def period_attributes= new_values
    @period.attributes = new_values
  end
end

في وحدة تحكم:

def search
  @criteria = Criteria.new params[:criteria]
end

في المساعد:

def criteria_index_path ct, options = {}
  url_for :action => :search
end

في الرأي:

<%= form_for @criteria do |form| %>
  <%= form.fields_for :period do |prf| %>
    <%= prf.text_field :beginning_as_text %>
    <%= prf.text_field :end_as_text %>
  <% end %>
  <%= form.submit "Search" %>
<% end %>

تنتج HTML:

<form action="/admin/search" id="new_criteria" method="post">
  <input id="criteria_period_attributes_beginning_as_text" name="criteria[period_attributes][beginning_as_text]" type="text"> 
  <input id="criteria_period_attributes_end_as_text" name="criteria[period_attributes][end_as_text]" type="text">

ملحوظة: سمة الإجراء المقدم من المساعد والسمات المتداخلة تسمية تنسيق يجعلها بسيطة جدا لتحميل جميع القيم في وقت واحد

هنالك جوهرة activerecord-towless. وبعد إنها جوهرها لإنشاء نماذج activerecord مسند، لذلك لديها دعم للتحقق من الصحة والجمعيات وأنواعها. وهو يدعم الرقم القياسي النشط 2.3، 3.0، 3.2

الطريقة الموصى بها للقيام بذلك في القضبان 3.x (باستخدام ActiveModel) لا يوجد لديه دعم للجمعيات ولا أنواع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top