/ / Як створити модель рейки з підмножини табличних записів - ruby-on-rails-3, ruby-on-rails-3.1, rails-models

Як створити модель Rails з підмножини табличних записів - ruby-on-rail-3, ruby-on-rail-3.1, rail-models

Я намагаюся створити кілька моделей, які всітягнути з того ж столу. Як обмежити записи таблиці в кожній моделі? І перш ніж ви скажете мені змінити структуру даних, це додаток для звітності, який витягується з попередньої резервної бази даних, над якою я не маю ніякого контролю.

Мій стіл виглядає приблизно так:

Vehicle_Table
id vehicle_type name
--------------------
1  Car          Foo
2  Car          Bar
3  Motorcycle   Baz
4  Car          Barf

І я хочу створити такі моделі для автомобілів та мотоциклів, як:

class Car < ActiveRecord::Base
set_table_name "Vehicle_Table"

end

і

class Motorcycle < ActiveRecord::Base
set_table_name "Vehicle_Table"

end

Але я поняття не маю, як сказати: "Ей, активний запис, я хочу лише записів, де Veh_type = мотоцикл в моделі мотоцикла".

Я впевнений, що це "friggin" очевидно, але всі мої пошуки Google повертають способи НАЙМИТИ підмножини в моделі, а не RESTRICT модель до певного підмножини записів.

Відповіді:

4 для відповіді № 1

Це називається спадковою системою однієї таблиці (STI).

Якщо у вас була стовпець з назвою type у вашій таблиці вона, ймовірно, спрацює автоматично. Але ви можете змінити цю назву стовпця, яку Rails використовує для розгляду типів.

http://api.rubyonrails.org/classes/ActiveRecord/Base.html

Успадкування однієї таблиці

Активний запис дозволяє успадкувати, зберігаючиназва класу в стовпці, який за замовчуванням називається "type" (можна змінити, перезаписавши Base.inheritance_column). Це означає, що спадщина виглядає приблизно так:

class Company < ActiveRecord::Base; end
class Firm < Company; end
class Client < Company; end
class PriorityClient < Client; end

Коли ви робите фірму.create (: name => "37signals"), цей запис буде збережено в таблиці компаній з type = "Firm". Потім ви можете знову отримати цей рядок, використовуючи Company.where (: name => "37signals"). Перший, і він поверне об'єкт Firm.

Отже, спробуйте цей код

class Car < ActiveRecord::Base
set_table_name "Vehicle_Table"
self.inheritance_column = :vehicle_type
end

2 для відповіді № 2

Коментували вище, але мали обмежені можливості редагування. Я натрапив на цю точну проблему і знайшов другу половину рішення деінде. STI дозволить вам отримати підмножину таблиці на основі стовпця в таблиці, але це відключить назву класу, щоб знайти записи для цього класу. Наприклад:

class Company < ActiveRecord::Base; end
class Client < Company; end

Це перегляне таблицю з назвою "Компанія" для записів, які мають значення "Клієнт", у стовпці "Тип".

Ви можете замінити стовпчик, який перевіряє НТІ, виконавши

class Company < ActiveRecord::Base
self.inheritance_column = :company_type
end

Але він все одно шукає, щоб цей стовпець містив "Клієнт". Ви можете перевизначити, яке значення воно шукає, виконавши це:

class Client < Company
def self.sti_name
1
end
end

Тепер буде розглянуто стовпець company_type для рядків зі значенням 1.

Для Rails-4.2 це майже однаково, але не потребує методу класу:

  private

self.inheritance_column = :company_type

def sti_name
1
end