Переопределение защиты первичного ключа в Rails - PullRequest
1 голос
/ 05 декабря 2009

Есть ли способ переопределить защиту массового назначения в первичном ключе модели в Rails? Мои данные seed.rb не будут загружаться из-за этого.

Обновление

Я обнаружил, что включение следующего кода в модель снимает защиту

def attributes_protected_by_default
  default = super
  default.delete self.class.primary_key
  default
end

Не идеально

Ответы [ 4 ]

3 голосов
/ 05 декабря 2009

Использовать атрибут прямого назначения. Вы также можете воспользоваться блоками.

Model.create! do |m|
  m.id = 27
  m.attribute = "foo"
end
1 голос
/ 17 декабря 2011

Я использую rails 3.1, и ни один из приведенных выше ответов не работает для меня (работа со старой схемой БД).

Это работает, хотя:

class ActiveRecord::Base

  def self.no_pk_protection!
    # yikes
    default_scope :order => primary_key # this is necessary so first and last don't fail
    attr_accessor :mock_pk
    set_primary_key :mock_pk
  end

end

... а затем:

class Category < ActiveRecord::Base

  no_pk_protection!

end
0 голосов
/ 06 декабря 2009

Снятие защиты с массовых назначений ради посева, скажем так, неразумно.Веппос предложил использовать прямое присвоение, на которое вы сказали:

Не идеально подходит для начальных данных, когда вы пытаетесь создать значительное количество записей.назначение имеет значение?Вы можете перебирать массив или хеш данных, заполняя его прямым присваиванием так же легко, как передавать хеш в конструктор.Вы ничего не сохраняете.

Другим способом было бы заполнение базы данных напрямую с помощью необработанного SQL, но заполнение - это не та операция, которую вам нужно выполнять так часто, чтобы ее оптимизировать.

0 голосов
/ 06 декабря 2009

Редко возникает необходимость непосредственно касаться внешних клавиш, например,

post = Post.create :title => "Lorem ipsum", :text => "dolor sit amet…"
comment = Comment.create :text => "Etiam mi mi, imperdiet a tempus suscipit…"
comment.post = post
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...