Вопрос по ruby-on-rails – Как инициализировать ActiveRecord со значениями в Rails?
На обычной Java я использую:
<code>public User(String name, String email) { this.name = name; this.email = f(email); this.admin = false; } </code>
Однако я не смог найти простой стандартный способ сделать это в rails (3.2.3) с ActiveRecords.
1. override initialize<code>def initialize(attributes = {}, options = {}) @name = attributes[:name] @email = f(attributes[:email]) @admin = false end </code>
но это может быть упущено при созданиизапись из БД
2. using theafter_initialize
callback
переопределив это:
<code>def after_initialize(attributes = {}, options = {}) ... end </code>
или с макросом:
<code>after_initialize : my_own_little_init def my_own_little_init(attributes = {}, options = {}) ... end </code>
но может бытьнекоторые проблемы с амортизацией.
Есть некоторыеДругой связив СО, но они могут быть устаревшими.
Так,what's the correct/standard method to use?
User.new(:name => 'Bon', :email => '[email protected]')
. Вы хотите использовать его по-другому?
Dylan Markow
когда они будут применяться ко ВСЕМ записям. Та
def change
creates_table :posts do |t|
t.boolean :published, default: false
t.string :title
t.text :content
t.references :author
t.timestamps
end
end
Вот, каждое новое сообщение будет опубликовано как ложное. Если вы хотите использовать значения по умолчанию на уровне объекта, лучше всего использовать реализации в стиле Factory:
User.build_admin(params)
def self.build_admin(params)
user = User.new(params)
user.admin = true
user
end
def self.build_normalized(params)
фабричный метод? это передает работу по поиску правильного метода создания клиенту моего кода. И это не охватывает все пути выполнения. Кроме того, есть ли заводская утилита для использования в рельсах? или стандартный шаблон?
Asaf
After_initialize. Потому что при инициализации мы должны объявить супер, поэтому лучше использовать обратный вызов.
after_create
новыйafter_intitialize
?
James McMahon
after_intitialize
. Я обновил ссылку документации.
Mauro George
Одно из решений, которое мне нравится, - через прицелы:
class User ...
scope :admins, where(admin: true)
Затем вы можете сделать и то и другое: создать нового пользователя в статусе администратора (т.е. сadmin
==true
) с помощьюUser.admins.new(...)
и таким же образом получи всех своих админовUser.admins
.
Вы можете сделать несколько областей и использовать их в качестве шаблонов для создания / поиска. Также вы можете использоватьdefault_scope
с тем же значением, но без имени, которое применяется по умолчанию.
default_scope
для этого? а как насчет других манипуляций с параметрами в конструкторе?
Asaf
where(deleted: false)
и вы никогда не столкнетесь с удаленными ответами, если не переопределите свою область действия, скажем, черComment.where(deleted: true)
или черезunscoped
метод:Comment.unscoped
. Есть и другие способы, но мне нравится этот:)
jdoe
default_scope include: :tags
. Но это другая история. :)
jdoe
ю в базе данных, очевидно, будет работать, похоже, он нарушает соглашение Rails о том, что приложением должна обрабатываться целостность данных (и, следовательно, значений по умолчанию?).
Я наткнулся на этопосл. Поскольку вы, возможно, не захотите сохранять запись в базе данных немедленно, я думаю, что лучший способ - переписать метод initialize с помощью вызоваwrite_attribute()
.
def initialize
super
write_attribute(name, "John Doe")
write_attribute(email, f(email))
write_attribute(admin, false)
end