2010-10-16 30 views
21

Tôi có một mô hình địa điểm và tôi muốn làm điều nàyRails tìm hoặc tạo dựa trên hai lĩnh vực

Venue.find_or_create_by_ 

nhưng tôi chỉ muốn có một địa điểm mới được tạo ra nếu một có cùng tên và ngày làm chưa tồn tại

Ví dụ

=> Venue(id: integer, location: string, showdate: datetime, created_at: datetime, updated_at: datetime) 

Một địa điểm là duy nhất và cần phải được tạo ra nếu vị trí và showdate không có mặt trong db

Trả lời

41

Bạn có thể chuỗi các cột lại với nhau bằng cách sử dụng _and_. Điều này sẽ làm các trick:

Venue.find_or_create_by_location_and_showdate(location, showdate) 
+0

Jeez, Rails và đặc biệt là Ruby liên tục làm tôi ngạc nhiên. Làm thế nào để nó biết chức năng đó có ý nghĩa gì? Có một số loại bắt tất cả hàm find_or_create_by_ * diễn giải nó không? – Jordan

+7

Trên thực tế nevermind, tôi đã có một cái nhìn tại nguồn Rails - Rails sử dụng một hàm method_missing mà một regex trên phương thức được gọi và phân tích nó. Đó là thiên tài. Nếu ai khác quan tâm, hãy kiểm tra active_record/base.rb trong nguồn Rails. – Jordan

+0

Cũng được chấp nhận là chuyển chúng làm đối số. Venue.find_or_create_by (: location => location,: showdate => showdate) –

1
my_class = ClassName.find_or_initialize_by_showdate_and_location(showdate,location) 
my_class.update_attributes! 

find_or_initialize phương thức tìm theo tên và vị trí trong cơ sở dữ liệu. Nếu bản ghi không tồn tại, nó sẽ khởi tạo bản ghi mới với vị trí hiển thị và vị trí. http://api.rubyonrails.org/classes/ActiveRecord/Base.html Liên kết này sẽ giúp bạn tìm ra find_or_initialize và find_or_create.

+0

Gọi '.update_attributes! 'Mà không truyền bất kỳ thuộc tính nào là vô ích. '.save!' sẽ là một lựa chọn tốt hơn nhiều. Và trong trường hợp này, người yêu cầu đã nói rằng anh ta muốn sử dụng '.find_or_create', vì vậy bạn không cần phải khởi tạo và lưu bản ghi trong hai bước riêng biệt. – vonconrad

+0

@vonconrad Tôi đã cung cấp liên kết đưa ra ý tưởng về cả hai phương pháp. Dù người dùng muốn sử dụng nó. Tôi đã đưa ra ý tưởng cả hai phương pháp có sẵn. –

+1

sử dụng find_or_initialize khắc phục được sự cố khi cố gắng tạo bản ghi khi có các xác thực không được tạo bằng cách tạo. ví dụ. Di chuyển dữ liệu từ một hệ thống khác. – Gary

7

Trong ray 4 bạn sẽ làm gì:

Venue.find_or_create_by(location: location, showdate: showdate) 

đẹp hơn nhiều, nếu bạn hỏi tôi!

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