Я намагаюся створити кілька моделей, які всітягнути з того ж столу. Як обмежити записи таблиці в кожній моделі? І перш ніж ви скажете мені змінити структуру даних, це додаток для звітності, який витягується з попередньої резервної бази даних, над якою я не маю ніякого контролю.
Мій стіл виглядає приблизно так:
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