我实际上面对一些计算机科学的艰苦练习(我觉得很难,哈哈)。
我们正在使用Ruby on Rails做一些基本的事情,我必须打开一个csv文件来获取有关我的'User'模型的附加信息,这是一个普通的rails脚手架。
所以目前我在users_controller.rb文件中打开csv文件并搜索正确的行,然后将它们添加到实例变量中。
但我想知道我是否可以编写一个类似于ActiveRecord模型的类。所以我更改代码以使用ActiveModel。但正如我在一些谷歌搜索结果中所读到的那样,ActiveModel无法像协会那样使用ActiveRecord。但拥有它们会很棒。
所以我希望你能帮助我。我如何为我的模型提供像协会这样的ActiveRecors?
问候 梅拉妮
答案 0 :(得分:1)
将CSV文件作为模型表示为绝对正确的。
但是,尝试合并Active Model听起来很棘手,几乎肯定需要大量的黑客攻击或猴子修补。
除非你真的需要与其他模型的关联,否则我会在models目录中创建一个独立的类(即不从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文件行。
答案 1 :(得分:0)
每次,当您创建自己的模型时,它都是ActiveRecord的继承:
class Project < ActiveRecord::Base
attr_accessible :content, :name, :user
end
然后你可以告诉你的模型有很多(比方说)Project的任务,它创建了一个关联。请提供您的应用程序逻辑的示例。
以下是RailsCasts.com的引用:
“在Rails 3中,Active Record的非数据库功能被提取到Active Model中。这使您可以在无表格模型中干净地添加验证和其他功能。” 还有一个很好的描述如何通过添加模块在模型中添加功能。
答案 2 :(得分: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的帮助。