簡體   English   中英

了解Ruby on Rails ActiveRecord模型訪問器

[英]Understanding Ruby on Rails ActiveRecord model Accessors

我的模型,“DataFile”,有一堆字段,我想從模型外部設置,例如

file = DataFile.new
file.owner = 123

現在,據我所知,我必須在我的模型中放置一個“attr_accessor:field”,用於我想從外部修改的每個字段。 但是,上面的代碼運行正常,沒有定義任何attr_accessors,將owner字段設置為123.為什么?

我希望得到一個“方法未定義”錯誤或類似的東西。

因為Rails的ORM使用ActiveRecord模式,所以為與該表關聯的數據庫中的每個列自動創建兩個方法: columnnamecolumnname = 由於您的模型繼承自ActiveRecord :: Base,這會“自動”發生。 這些方法是使用ruby的元編程工具定義的,並且是在創建類時動態創建的。

有關確切內容的更多信息,我將查看Rails源代碼。 但是,上述內容可能足以讓您對正在發生的事情有所了解。

Drew和Zepplock做對了,但我還要補充一點。 Rails(實際上,ActiveRecord)為數據庫字段創建的訪問器不是Ruby訪問器,如果使用腳本/控制台,您將看到所有者不是目標文件的實例變量。

在您遠離標准訪問器並試圖在文件中的方法中操作@owner之前,您可能永遠不會注意到這一點。 如果你在學習Rails的同時學習Rails(這就是我所做的),那么你可能會在某些時候遇到這個問題。 這就是你需要寫的原因:

class MyClass < ActiveRecord::Base
  def invalidate_owner
    self.owner = owner << " no longer owns this"
    save
  end
end

代替

class MyClass < ActiveRecord::Base
  def invalidate_owner
    self.owner << " no longer owns this"
    save
  end
end

很可能“所有者”是數據庫模型的一部分。 將自動為您生成數據庫字段的訪問者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM