Làm thế nào để kiểm tra nếu một mô hình có một cột / thuộc tính nhất định?


123

Tôi có một phương thức cần lặp qua hàm băm và kiểm tra xem mỗi khóa có tồn tại trong bảng mô hình hay không, nếu không nó sẽ xóa khóa / giá trị.

ví dụ

number_hash = { :one => "one", :two => "two" }

và bảng Số chỉ có một: một cột vì vậy: hai sẽ bị xóa.

Làm cách nào để kiểm tra xem một mô hình có thuộc tính hay không?

Câu trả lời:


205

Cho một lớp học

Sử dụng Class.column_names.include? attr_nameở đâu attr_namelà tên chuỗi của thuộc tính của bạn.

Trong trường hợp này: Number.column_names.include? 'one'

Cho một ví dụ

Sử dụng record.has_attribute?(:attr_name)hoặc record.has_attribute?('attr_name')(Rails 3.2+) hoặc record.attributes.has_key? attr_name.

Trong trường hợp này: number.has_attribute?(:one)hoặc number.has_attribute?('one')hoặcnumber.attributes.has_key? 'one'


Đối với điểm thưởng sử dụng Hash#select:number_hash.select { |key, value| Number.column_names.include? key }
hgmnz

28
Trong Rails 3.2+, sử dụng number.has_attribute?chấp nhận Biểu tượng hoặc Chuỗi
Marc-André Lafortune

Tôi tin rằng nếu một đối tượng ủy quyền một phương thức cho một đối tượng khác, phương thức này sẽ gợi ý sai cột tồn tại. Tôi đã kiểm tra các mô hình của tôi cho những người cóuser , nhưng thay vào đó phải tìm kiếm user_idvì một số mô hình ủy quyền cho người dùng.
MattyB

Hash#has_key? không được ủng hộ Hash#key?
Charles Hamel

Làm thế nào về việc sử dụng property_method? cho một lớp họcNumber.attribute_method? 'one'
ouranos

13

Nếu bạn cần kiểm tra bí danh là tốt, bạn có thể sử dụng Number.method_defined? attr_namehoặc number.class.method_defined? attr_name.

Tôi đã phải làm điều này cho một đối tượng Mongoid có các trường bí danh.


Tôi thấy ModelName.attribute_method? :attr_namelà những gì làm việc trong trường hợp của tôi
somedirection

10

Trong đối tượng cá thể của bạn, bạn cũng có thể sử dụng defined? instance.attributehoặc instance.respond_to? :attribute.
Đây là những giải pháp chung hơn để kiểm tra một thuộc tính mô hình hoặc bất kỳ phương thức nào.


3
Xin lưu ý:instance.respond_to?(:attribute) == false ; instance.attribute ; instance.respond_to?(:attribute) == true
kbrock
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.