Как создать модель Rails из подмножества записей таблиц - PullRequest
4 голосов
/ 15 февраля 2012

Я пытаюсь создать несколько моделей, которые все извлекают из одной таблицы Как ограничить записи таблицы в каждой модели? И прежде чем вы скажете мне изменить мою структуру данных, это приложение для создания отчетов, которое извлекает данные из существующей резервной БД, над которой у меня нет контроля.

Мой стол выглядит примерно так:

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

Но я понятия не имею, как сказать: «Эй, Active Record, я хочу только записи, где vehicle_type = мотоцикл в модели мотоцикла».

Я уверен, что это чертовски очевидно, но все мои поиски в Google возвращают способы НАЙТИ подмножества в модели, а не ОГРАНИЧИТЬ модель для определенного подмножества записей.

Ответы [ 2 ]

5 голосов
/ 15 февраля 2012

Это называется наследованием одной таблицы (STI).

Если в вашей таблице есть столбец с именем type, он, вероятно, будет работать автоматически.Но вы можете изменить это имя столбца, которое Rails использует для разделения типов.

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

Наследование одной таблицы

Active Record позволяет наследовать, сохраняя имякласса в столбце, который по умолчанию называется «тип» (может быть изменен путем перезаписи Base.inheritance_column).Это означает, что наследование выглядит следующим образом:

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

При выполнении Firm.create (: name => "37signals") эта запись будет сохранена в таблице компаний сТип = «Фирма».Затем вы можете снова извлечь эту строку, используя Company.where (: name => 37signals), и он вернет объект Firm.

Итак, попробуйте этот код

class Car < ActiveRecord::Base
  set_table_name 'Vehicle_Table'
  self.inheritance_column = :vehicle_type
end
3 голосов
/ 23 июля 2015

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

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

При этом в таблице с именем Company будут найдены записи со значением «Клиент» в столбце с именем «Тип».

Вы можете переопределить столбец, который STIпроверяет, выполняя

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
...