我正在尝试为我的服务创建基本的 CRUD。它基于在结构中创建的数据模型。问题是我真的不想重复 CRUD 方法的代码。例如,我将 ModelA 和 ModelB 定义为结构:
type ModelA struct {
ID bson.ObjectId `json:"ID,omitempty" bson:"_id,omitempty"`
Slug string `json:"slug" bson:"slug,omitempty"`
Creator string `json:"-" bson:"creator,omitempty"`
DefaultLanguage string `json:"defaultLanguage" bson:"defaultLanguage,omitempty"`
}
type ModelB struct {
ID bson.ObjectId `json:"ID,omitempty" bson:"_id,omitempty"`
Type string `json:"type" bson:"type,omitempty"`
}
我想要的是制作通用方法来检索给定模型的数组。使用模型对我来说很重要。我可以使用纯 interface{} 类型快速完成,但会丢失模型功能,例如在 JSON 输出中隐藏一些属性(例如 ModelA.Creator)。
到目前为止,我已经创建了用于创建新数据和检索单个模型的通用方法。这是示例代码:
// GET: /modelsa/{:slug}
func (r *Routes) GetModelA(w rest.ResponseWriter, req *rest.Request) {
// set model as ModelA
var model models.ModelA
r.GetBySlug(w, req, &model, "models")
}
// GET: /modelsb/{:slug}
func (r *Routes) GetModelB(w rest.ResponseWriter, req *rest.Request) {
// set model as ModelB
var model models.ModelB
r.GetBySlug(w, req, &model, "models")
}
func (r *Routes) GetBySlug(w rest.ResponseWriter, req *rest.Request, m interface{}, collection string) {
slug := req.PathParam("slug")
if err := r.GetDocumentBySlug(slug, collection, m, w, req); err != nil {
rest.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.WriteJson(m)
}
GetModelA 和 GetModelB 是路由处理程序,它们使用通用方法 GetBySlug 返回由给定模型格式化的 JSON。
我想做同样的事情,但使用给定模型的数组。到目前为止,我在将结果转换为结构时遇到了问题:
// GET /modelsa/
func (r *Routes) GetModels(w rest.ResponseWriter, req *rest.Request) {
// I think in this case I don't have to pass an array of struct
// because the given struct is only reference. It could be:
// var result models.ModelA as well. Converting it into array could
// be done in GetList() method
var result []models.ModelA
r.GetList(w, req, &result, "models")
}
func (r *Routes) GetList(w rest.ResponseWriter, req *rest.Request, res interface{}, col string) {
}
我无法将 res 参数设置为 interface{} 数组。此外,如果我尝试在 GetList() 方法中将结果转换为 []interface{},我无法将其转换为 res参数,因为它不是数组。
有什么好的方法吗?也许我想错了,应该重新设计方法?任何建议将不胜感激。
最佳答案
您可以声明表示模型 slice 的新类型。例如,
type ModelAList []ModelA
type ModelBList []ModelB
然后,当您将这些新类型的变量传递到您的 r.GetDocumentBySlug() 时,encoding/json 包中的函数将相应地解码 slice 。
您可以找到工作示例 here (marshaling)和 here (unmarshaling) .
关于go - 检索模型(结构)列表的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45650875/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah