ActiveRecord::Base 不带表
这是不久前出现的( rails 模型属性在数据库中没有相应的列 ),但看起来提到的 Rails 插件没有维护( http://agilewebdevelopment.com/plugins/activerecord_base_without_table )。 没有办法用 ActiveRecord 来做到这一点吗?
如果没有,有没有办法在不使用ActiveRecord的情况下获取ActiveRecord验证规则?
当然,ActiveRecord 希望该表存在。
This came up a bit ago ( rails model attributes without corresponding column in db ) but it looks like the Rails plugin mentioned is not maintained ( http://agilewebdevelopment.com/plugins/activerecord_base_without_table ). Is there no way to do this with ActiveRecord as is?
If not, is there any way to get ActiveRecord validation rules without using ActiveRecord?
ActiveRecord wants the table to exist, of course.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
这是我过去使用过的方法:
在app/models/tableless.rb
中在app/models/foo.rb
中在script/console中强>
This is an approach I have used in the past:
In app/models/tableless.rb
In app/models/foo.rb
In script/console
只是对已接受答案的补充:
使您的子类继承父列:
Just an addition to the accepted answer:
Make your subclasses inherit the parent columns with:
更新: 对于 Rails 3,这可以非常容易地完成。 在 Rails 3+ 中,您可以使用新的
ActiveModel
模块及其子模块。 现在应该可以使用:有关更多信息,您可以查看 Railscast (或 < a href="http://asciicasts.com/episodes/219-active-model" rel="nofollow noreferrer">在 AsciiCasts 上阅读有关该主题的内容),以及此 Yehuda Katz 的博客文章。
旧答案如下:
您可能需要将其添加到约翰·托普利在上一篇评论中提出的解决方案中:
如果您需要的话,这将为您提供一个“假”表名。 如果没有此方法,
Foo::table_name
将计算为“tablelesses”。UPDATE: For Rails 3 this can be done very easy. In Rails 3+ you can use the new
ActiveModel
module and its submodules. This should work now:For more info, you can check out the Railscast (or read about it on AsciiCasts) on the topic, as well as this blog post by Yehuda Katz.
OLD ANSWER FOLLOWS:
You may need to add this to the solution, proposed by John Topley in the previous comment:
This provides you with a "fake" table name, if you need one. Without this method,
Foo::table_name
will evaluate to "tablelesses".验证只是 ActiveRecord 中的一个模块。 您是否尝试过将它们混合到您的非 ActiveRecord 模型中?
Validations are simply a module within ActiveRecord. Have you tried mixing them into your non-ActiveRecord model?
我认为答案越多越好,因为这是谷歌搜索“不带表的rails 3.1模型”时的第一个结果之一
我在不使用ActiveRecord::Base的情况下实现了同样的事情,同时包括ActiveRecord::Validations
主要目标是让一切都以格式工作,下面我提供了一个示例付款,该付款不会保存在任何地方,但仍然能够使用我们都知道和喜爱的验证进行验证。
我希望这对某人有帮助,因为我今天花了几个小时试图解决这个问题。
I figure the more answers the better since this is one of the first results in google when searching for "rails 3.1 models without tables"
I've implements the same thing without using ActiveRecord::Base while including the ActiveRecord::Validations
The main goal was to get everything working in formtastic, and below I've included a sample payment that will not get saved anywhere but still has the ability to be validated using the validations we all know and love.
I hope this helps someone as I've spent a few hours trying to figure this out today.
这是一个搜索表单,它呈现一个名为 criteria 的对象,该对象具有一个带有 beginning 和 end 属性的嵌套 period 对象。
控制器中的操作非常简单,但它会从表单上的嵌套对象加载值,并在必要时重新呈现带有错误消息的相同值。
适用于 Rails 3.1。
模型:
在控制器中:
在帮助器中:
在视图中:
生成 HTML:
注意:帮助器提供的操作属性以及嵌套属性命名格式使控制器可以非常简单地一次加载所有值
This is a search form that presents an object called criteria that has a nested period object with beginning and end attributes.
The action in the controller is really simple yet it loads values from nested objects on the form and re-renders the same values with error messages if necessary.
Works on Rails 3.1.
The model:
In the controller:
In the helper:
In the view:
Produces the HTML:
Note: The action attribute provided by the helper and the nested attributes naming format that makes it so simple for the controller to load all the values at once
有activerecord-tableless gem。 它是创建无表 ActiveRecord 模型的瑰宝,因此它支持验证、关联、类型。 它支持 Active Record 2.3、3.0、3.2
在 Rails 3.x 中推荐的方法(使用 ActiveModel)不支持关联或类型。
There is the activerecord-tableless gem. It's a gem to create tableless ActiveRecord models, so it has support for validations, associations, types. It supports Active Record 2.3, 3.0, 3.2
The recommended way to do it in Rails 3.x (using ActiveModel) has no support for associations nor types.