Я хотел бы выполнить:
XXX.find_or_build_by_language_id(attributes)
Я нашел
XXX.find_or_initialize_by_language_id(attributes)
, но это только установить language_id и никаких других атрибутов.Даже если я вручную задаю атрибуты, запись не сохраняется при выполнении XXX.save.
Я просто читаю Rails - найти или создать - есть ли поиск или сборка? , чтокажется, связано с моей проблемой, но не соответствует моим потребностям.
Редактировать
Давайте использовать этот сценарий
# db/migrations/create_models.rb
class CreateModels < ActiveRecord::Migration
def self.up
create_table :companies do |t|
t.string :name
end
create_table :employees do |t|
t.string :name
t.string :city
t.references :company
end
end
end
-
# app/models/employee.rb
class Employee < ActiveRecord::Base
belongs_to :company
end
-
# app/models/company.rb
class Company < ActiveRecord::Base
has_many :employees
end
-
# rails console
:001> c = Company.new
=> #<Company id: nil, name: nil>
:002> c.employees
=> []
:003> e = c.employees.find_or_initialize_by_name(:name => 'foo', :city => 'bar')
=> #<Employee id: nil, name: "foo", city: "bar", company_id: nil>
:004> c.employees
=> []
:005> c.save
=> true
:006> c.employees
=> []
:007> e.save
=> true
:008> c = Company.first
=> #<Company id: 1, name: nil>
:009> c.employees
=> [#<Employee id: 1, name: "foo", city: "bar", company_id: 1>]
:010> e = c.employees.find_or_initialize_by_name(:name => 'foo', :city => 'baz')
=> #<Employee id: 1, name: "foo", city: "bar", company_id: 1>
:011> e.city = 'baz'
=> "baz"
:012> c.employees
=> [#<Employee id: 1, name: "foo", city: "bar", company_id: 1>]
:013 > c.save
=> true
:014> c.employees
=> [#<Employee id: 1, name: "foo", city: "bar", company_id: 1>]
Проблемы
- : 004 => Сотрудник с: 003 не добавлен в c.employees
- : 006 => Сотрудник с: 003 сохраняется с помощью c
- : 010 => Городской атрибут сотрудника не установлен
- : 014 => Городской атрибут сотрудника не обновляется, когдаспасательная компания