2010-06-11 28 views
23
if ClassName.exists?(["id = ?", self.id]) 
    object = ClassName.find_by_name(self.name) 
    object.update_attributes!(:street_address => self.street_address, 
    :city_name => self.city_name, 
    :name => self.org_unit_name, 
    :state_prov_id => self.state_prov_id, 
    :zip_code => self.zip_code) 
else 
    ClassName.create! :street_address => self.street_address, 
    :city_name => self.city_name, 
    :federalid => self.federalid, 
    :name => self.org_unit_name, 
    :state_prov_id => self.state_prov_id, 
    :zip_code => self.zip_code 
end 

Tôi có mã như thế này. Tôi muốn cải thiện nó để nó sử dụng một phương thức, giống như create_or_update.phương pháp create_or_update trong đường ray

ClassName.create_or_update_by_name(:name => self.name, 
    :street_address => self.street_address, 
    :city_name => self.city_name, 
    :federalid => self.federalid, 
    :name => self.org_unit_name, 
    :state_prov_id => self.state_prov_id, 
    :zip_code => self.zip_code) 

Nếu name tồn tại trong cơ sở dữ liệu thì cần cập nhật đối tượng đó nếu không nó sẽ tạo đối tượng mới.

Có phương pháp nào tồn tại mà tôi có thể thực hiện việc này không?

Trả lời

79
my_class = ClassName.find_or_initialize_by_name(name) 

my_class.update_attributes(
    :street_address => self.street_address, 
    :city_name => self.city_name, 
    :federalid => self.federalid, 
    :state_prov_id => self.state_prov_id, 
    :zip_code => self.zip_code 
) 
+3

Cảm ơn vì điều này. Như một lưu ý, tên không phải được chuyển vào một lần nữa vì nó đã được khởi tạo với một tên. Ngoài ra các dấu ngoặc không cần thiết ở đây. –

+0

Và vì vậy các hoạt động riêng biệt, không phải trong giao dịch. – Green

+0

find_or_intialize_by_method không được dùng như Rails 4 –

6
person = Person.find_by_name(name) || Person.new(:name => name) 
person.update_attributes!(:street_address => street_address, :city_name => city_name) #etc etc 
8

Câu trả lời đã kiểm tra trên hoạt động tốt cho Rails 3. Điều đó nói rằng các find_or_initialize_by_attribute phương pháp đã được tán thành trong Rails 4. Đây là cách mới. Xem Rails4 Deprecation warning for find_or_initialize_by method

person = Person.find_or_initialize(name: 'name') 
person.update_attributes(other_attrs) 
+0

'First_or_initialize' - nó sẽ trả về giá trị đầu tiên nếu không tìm thấy gì, vì vậy trên thực tế nó sẽ không trả về bản ghi mong muốn với tên' name: name' như tên đầu tiên có thể là 'name: differentName' và bạn sẽ kết thúc cập nhật hồ sơ không mong muốn – Aleks

+0

@Được rồi, bạn chính xác. Nên đã đọc 'find_or_initailize (tên: tên)' –

+0

Cảm ơn. Loại bỏ các downwote :) – Aleks

Các vấn đề liên quan