2011-05-06 41 views
10

Tôi có một mô hình cho một trong các bảng cơ sở dữ liệu của mình. Tôi muốn ghi đè tên cột cho bảng cụ thể đó. Làm thế nào tôi sẽ đạt được nó.Làm thế nào để ghi đè lên một cột trong mô hình Rails?

Ví dụ, hãy để bàn của tôi được gọi DUMMY và nó có một cột gọi là col_a

col_a 
20 
34 
42 
23 
12 

Tôi sẽ làm một @dummy.col_a. Bây giờ phương thức này sẽ trả lại cho tôi 0 cho các số kết thúc bằng 0 và cho mọi thứ khác, nó sẽ trả về giá trị ban đầu. Tôi có thể làm điều đó bằng cách xác định một phương pháp mới, nhưng tôi muốn ghi đè lên tên cột chính nó. Hãy giúp tôi.

Trả lời

22

Bạn có thể ghi đè phương thức col_a. Sử dụng phương thức read_attribute để đọc giá trị trong cơ sở dữ liệu. Một cái gì đó như thế này:

def col_a 
    if self.read_attribute(:col_a).to_s.end_with?('0') 
    0 
    else 
    self.read_attribute(:col_a) 
    end 
end 
9

Bạn chỉ có thể xác định một phương thức có cùng tên với cột. Để có được giá trị cột thực tế, hãy sử dụng self [column_name]. Vì vậy, một cái gì đó như thế này nên làm việc:

class Dummy < ActiveModel::Base 
    def col_a 
    self[:col_a] % 10 == 0 ? 0 : self[:col_a] 
    end 
end 

(Điều này giả định col_a là một số nguyên.)

+0

rằng nên được 'tự [: col_a]!% 10 = 0? self [: col_a]: 0' hoặc '(self [: col_a]% 10) .zero? ? 0: self [: col_a] ' – fl00r

+0

Yup - Tôi giả định 0 sẽ đánh giá sai ở đây, nhưng không. Đã sửa. – Thilo

4

Bạn có thể đạt được điều đó bằng cách overwriting default accessors như mô tả trong tài liệu. Tất cả các giá trị cột đều có sẵn tự động thông qua các trình truy cập cơ bản trên đối tượng Active Record, nhưng đôi khi bạn muốn chuyên hành vi này. Điều này có thể được thực hiện bằng cách ghi đè các accessors mặc định (sử dụng cùng tên với thuộc tính) và gọi read_attribute(attr_name)write_attribute(attr_name, value) để thực sự thay đổi mọi thứ.

Cuộn đến Ghi đè truy cập mặc định phần để biết thêm thông tin.

0

Tôi là một chút muộn để bên đây, nhưng một cách thực sự thanh lịch để làm điều đó chỉ đơn giản là sử dụng super

class Dummy < ApplicationRecord 
    def col_a 
    super % 10 === 0 ? 0 : super 
    end 
end 
Các vấn đề liên quan