2012-11-27 93 views
2

Acutally我面臨一些計算機科學的艱苦練習(對我來說很難,我認爲,哈哈)。Ruby on Rails ActiveModel with Associations

我們正在使用Ruby on Rails做一些基本的工作,我必須打開一個csv文件才能獲得有關我的'用戶'模型的其他信息,這是一種普通的鋼軌腳手架。

所以目前我打開我的users_controller.rb文件中的csv文件並搜索正確的行並將它們添加到實例變量中。

但我不知道我是否可以編寫一個類似ActiveRecord模型的類。所以我更改代碼以使用ActiveModel。但是,當我讀到一些谷歌的結果時,ActiveModel無法使用ActiveRecord類似的關聯。但擁有它們真是太棒了。

所以我希望你能幫助我。我怎樣才能提供我的模型與ActiveRecors像關聯?

問候 梅拉妮

回答

0

每一次,當你創建自己的模型,它是ActiveRecord的繼承:

class Project < ActiveRecord::Base 
attr_accessible :content, :name, :user 
end 

那麼你可以告訴你的模型有很多(比方說)項目的任務,它創建了一個關聯。請提供您的應用邏輯示例。

這裏是RailsCasts.com報價:

「在Rails 3活動記錄的非數據庫功能被提取出來到Active模式這個可以徹底的驗證和其他功能添加到無表格的車型。」 還有一個很好的描述,就是如何通過添加模塊來添加模型中的功能。

1

絕對正確的是,CSV文件應該表示爲模型,因爲它是數據。

但是,試圖融入主動模型聽起來很棘手,幾乎肯定會需要大量的黑客或猴子補丁。

除非你真的需要關聯到其他車型,我想創建一個獨立的類(即不從ActiveRecord::Base繼承)的車型目錄,並把邏輯在那裏解析CSV:

class User 
    attr_accessor :name, :email, ... 

    def initialize(name,email,...) 
     # set data 
    end 

    def self.find(param_for_search) 
     # Parse CSV file, find line you want 
     # return a User instance 
     self.new(name, email) 
    end 
end 

我不知道你的系統究竟是如何工作的,但是這樣你就可以使它的行爲方式類似於主動模型的東西。您可以添加類似的類方法,每個實例方法表示一個CSV文件行。

0

我明白,使用ActiveRecord使用一個非數據庫源是困難的,但我認爲這將是vewy迷人如果我能寫的東西是這樣的:在我看來

user.worktimes.first.value 

,並得到這樣的信息它是一個數據庫表。我訪問了railscast.com,我找到了一個這裏討論過的劇集。但我想深入挖掘這一點。有沒有更多的資源可以閱讀?

據我所知,ActiveModel不支持關聯?我想知道爲什麼關聯不會移動到ActiveModel,因爲它是一個非常有用的東西。:)

因此,這裏是我的代碼,我工作於:

用戶型號:

class User < ActiveRecord::Base 
    attr_accessible :department_id, :name 
    belongs_to :department 
end 

部門 - 型號:

class Department < ActiveRecord::Base 
    attr_accessible :name 
    has_many :users 
end 

這裏是我的CSV型號,我創建的:

class Worktime 
    attr_accessor :user_id,:date,:value 

    def initialize(params) 
     dir = Rails.root.join('app', 'models', 'worktimes.csv').to_s 
     source = File.open(dir,'r') 
     while(line=source.gets) 
      data = line.split(';') 

      if data[0] = params[:user_id] && data[1] = params[:date] 
       @value = data[2]  
      end 
     end 
    end 
end 

我非常感謝您的幫助,因爲我第一次使用導軌。