2012-06-28 2 views
1

Когда я выполняю метод Model.create, если я укажу значение для: id, он позже будет сведен к нулю. Пример:Rails: .create аннулирует пользовательское значение для: id

Model.create (
    :id => 50, 
    :name => Joe, 
    :enabled => yes 
) 

Вместо того, что я должен сделать, это использовать .new и сохранить его в переменной класса, храню значение идентификатора через переменную класса, а затем, наконец, назвать сохранить:

m = Model.new (
    :name => Joe, 
    :enabled => yes 
) 

m.id = 50 
m.save 

Я пытаюсь выполнить этот код в файле seeds.rb, и это НЕ очень сухой код. Как я могу сделать это лучше и добиться тех же результатов?

+0

Почему вы должны сделать это? Это вне конвенции Rails, поэтому убедитесь, что она не будет СУХОЙ (Rails «наказывает» вас за то, что вы вышли за рамки соглашения). – YuriAlbuquerque

+1

Это даже не вопрос о соглашениях Rails, это вопрос соглашений о реляционной базе данных. Если вы полагаетесь на первичные ключи, имеющие определенные значения в вашей логике ('do_something if user.id == 50'), вам нужно переосмыслить, что вы делаете. –

ответ

2

Идентификатор просто защищен. Чтобы этого избежать, вы можете переопределить список защищенных по умолчанию атрибутов. Будьте осторожны, делая это везде, где информация об атрибутах может поступать извне. Поле id по умолчанию защищено по какой-либо причине.

class Model < ActiveRecord::Base 
    private 
    def attributes_protected_by_default 
     [] 
    end 
end 

или пойти с @Leo ответить

+0

ДА! Спасибо, вы научили меня чему-то новому сегодня, и это имеет большой смысл! Согласитесь, это то, что каждый разработчик RoR должен быть осторожным при использовании. –

1

Это может быть ответ для вас. Model.create в основном Model.new с последующим Model.save и, так как изменения идентификатора и снова экономии вы можете также сделать

m = Model.new { 
    :name => Joe, 
    :enabled => yes 
} 
m.id = 50 
m.save! 

Это избавит вас от делать два экономит.

+0

Мой плохой. Я использовал «Model.new», но я слишком быстро использовал копию/вставку для моего вопроса. Сожалею. Я отредактировал свой первоначальный вопрос, чтобы исправить это. –

Смежные вопросы