Как вставить запись в Rails, когда нет модели и без использования SQL - PullRequest
0 голосов
/ 16 января 2012

Я создал таблицу, которая реализует отношение n-to-n, используя следующую инструкцию:

create_table :capabilities_roles, :id => false do |t|
  t.integer :capability_id, :null => false
  t.integer :role_id, :null => false
end

Нет модели для этой таблицы.Как вставить записи без обращения к SQL?

Я нашел это в модуле ActiveRecord :: ConnectionAdapters :: DatabaseStatements:

insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil)

, а также:

insert(arel, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds = [])

Понятия не имею, что значит арел.Может кто-нибудь привести пример правильной вставки?Я хотел бы использовать в нем такие вещи, как: role_id => Role.find_by_name ('Business user').

Ответы [ 3 ]

1 голос
/ 16 января 2012

Похоже, что таблица соединения имеет и относится ко многим отношениям между возможностями и ролевыми моделями.Вы должны позволить Rails справиться с этим за вас.Сначала определите необходимые ассоциации:

class Capability < ActiveRecord::Base
  has_and_belongs_to_many :roles
end

class Role < ActiveRecord::Base
  has_and_belongs_to_many :capabilities
end

Затем просто добавьте экземпляр модели ролей в массив ролей экземпляра модели возможностей (или наоборот):

capability.roles << role
role.capabilities << capability

Удаление записей из таблицы соединенийвыполняется путем удаления объекта из массива:

capability.roles -= [role]
1 голос
/ 16 января 2012

Если вы собираетесь манипулировать записями базы данных через Rails, то для этого должна быть модель. Просто создайте role.rb в каталоге моделей со строками

class Role < ActiveRecord::Base 
end

А ты как золото.

0 голосов
/ 09 сентября 2016

В нашем проекте у нас есть много мета таблиц, которые не имеют моделей.Для создания активных моделей записей на лету мы используем следующий модуль:

module EntityModel
  module_function
  ACCESS_MODELS = {}

  def for(table_name)
    return ACCESS_MODELS[table_name] if ACCESS_MODELS.has_key?(table_name.id)
    ACCESS_MODELS[table_name] = create_access_model(table_name)
  end

  def create_access_model(table_name)
    Class.new(ActiveRecord::Base) do
      self.table_name = table_name
    end
  end
end

Это создает анонимные модели и сохраняет их в глобальном хеше для повышения производительности.

Используется как:

EntityModel.for(:users)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...