วิธีตรวจสอบว่าโมเดลมีคอลัมน์ / แอตทริบิวต์หรือไม่?


123

ฉันมีวิธีการที่ต้องวนซ้ำแฮชและตรวจสอบว่าแต่ละคีย์มีอยู่ในตารางโมเดลหรือไม่มิฉะนั้นจะลบคีย์ / ค่า

ตัวอย่างเช่น

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

และตาราง Number มีเพียงคอลัมน์เดียวดังนั้น: สองคอลัมน์จะถูกลบ

ฉันจะตรวจสอบได้อย่างไรว่าโมเดลมีแอตทริบิวต์หรือไม่?

คำตอบ:


205

สำหรับชั้นเรียน

การใช้งานClass.column_names.include? attr_nameที่attr_nameเป็นชื่อสตริงของแอตทริบิวต์ของคุณ

ในกรณีนี้: Number.column_names.include? 'one'

สำหรับอินสแตนซ์

ใช้record.has_attribute?(:attr_name)หรือrecord.has_attribute?('attr_name')(Rails 3.2+) หรือrecord.attributes.has_key? attr_name.

ในกรณีนี้: number.has_attribute?(:one)หรือnumber.has_attribute?('one')หรือnumber.attributes.has_key? 'one'


สำหรับคะแนนโบนัสใช้Hash#select:number_hash.select { |key, value| Number.column_names.include? key }
hgmnz

28
ใน Rails 3.2+ ให้ใช้number.has_attribute?ซึ่งยอมรับ Symbol หรือ String
Marc-André Lafortune

ฉันเชื่อว่าถ้าออบเจ็กต์มอบหมายเมธอดให้กับออบเจ็กต์อื่นวิธีนี้จะแนะนำคอลัมน์ที่มีอยู่อย่างผิดพลาด ฉันกำลังตรวจสอบโมเดลของฉันเพื่อหารุ่นที่มีuserแต่ต้องมองหาแทนuser_idเนื่องจากบางรุ่นได้รับมอบหมายผู้ใช้
MattyB

Hash#has_key?เลิกใช้แล้วโดยชอบHash#key?
Charles Hamel

วิธีการใช้attribute_method? สำหรับชั้นเรียน:Number.attribute_method? 'one'
ouranos

13

หากคุณจำเป็นต้องตรวจสอบชื่อแทนเช่นกันคุณสามารถใช้หรือNumber.method_defined? attr_namenumber.class.method_defined? attr_name

ฉันต้องทำสิ่งนี้สำหรับวัตถุ Mongoid ที่มีเขตข้อมูลนามแฝง


ฉันพบว่าModelName.attribute_method? :attr_nameสิ่งที่ใช้ได้ผลในอินสแตนซ์ของฉัน
บาง

10

ในวัตถุตัวอย่างเช่นคุณสามารถใช้ยังหรือdefined? instance.attribute นี่เป็นวิธีการทั่วไปในการตรวจสอบแอตทริบิวต์ model หรือวิธีการใด ๆinstance.respond_to? :attribute


3
โปรดทราบ:instance.respond_to?(:attribute) == false ; instance.attribute ; instance.respond_to?(:attribute) == true
kbrock
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.