3

实际上,我在计算机科学方面面临一些艰巨的练习(我认为对我来说很难,哈哈)。

我们正在用 Ruby on Rails 做一些基本的事情,我必须打开一个 csv 文件来获取关于我的“用户”模型的更多信息,这是一个普通的 rails 脚手架。

所以目前我在 users_controller.rb 文件中打开 csv 文件并搜索正确的行并将它们添加到实例变量中。

但我想知道我是否可以编写一个类似于 ActiveRecord 模型的类。所以我将代码更改为使用 ActiveModel。但正如我在一些谷歌搜索结果中看到的,ActiveModel 不能使用 ActiveRecord 之类的关联。但拥有它们会很棒。

所以我希望你能帮助我。如何为我的模型提供 ActiveRecors 之类的关联?

问候梅兰妮

4

3 回答 3

1

将 CSV 文件表示为模型是绝对正确的,因为它是数据。

然而,尝试合并 Active Model 听起来很棘手,几乎可以肯定需要大量的黑客攻击或猴子补丁。

除非你真的需要与其他模型的关联,否则我会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

我不确切知道您的系统是如何工作的,但是通过这种方式,您可以使其行为方式类似于 Active Model 的东西。您可以添加类似的类方法,每个实例方法代表一个 CSV 文件行。

于 2012-11-27T11:03:43.230 回答
0

每次,当您创建自己的模型时,它都是 ActiveRecord 的继承:

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

然后你可以告诉你的模型有很多(比方说)项目的任务,这会创建一个关联。请提供您应用程序逻辑的示例。

这是来自RailsCasts.com的引述:

“在 Rails 3 中,Active Record 的非数据库功能被提取到 Active Model 中。这使您可以清晰地向无表模型添加验证和其他功能。” 还有一个很好的描述如何通过添加模块在模型中添加功能。

于 2012-11-27T10:57:55.537 回答
0

我知道,使用 ActiveRecord 来使用非数据库源是很困难的,但我认为如果我能写出这样的东西会非常迷人:

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

我非常感谢您的帮助,因为这是我第一次使用 Rails。

于 2012-11-28T16:01:44.480 回答