Rails

我如何获得Ruby类的名称?

十年热恋 提交于 2020-02-28 03:26:35
如何从ActiveRecord对象获取类名? 我有: result = User.find(1) 我试过了: result.class # => User(id: integer, name: string ...) result.to_s # => #<User:0x3d07cdc>" 我只需要字符串中的类名(在本例中为 User )。 有没有办法呢? 我知道这是非常基本的,但我搜索了Rails和Ruby的文档,我找不到它。 #1楼 这是正确答案,摘自Daniel Rikowski和pseidemann的评论。 我厌倦了通过评论来寻找合适的答案...... 如果您使用Rails(ActiveSupport): result.class.name.demodulize 如果你使用POR(普通红宝石): result.class.name.split('::').last #2楼 在我的情况下,当我使用类似 result.class.name 东西时,我得到了类似 Module1::class_name 东西。 但是如果我们只想要 class_name ,请使用 result.class.table_name.singularize #3楼 如果要从类方法中获取类名,则 class.name 或 self.class.name 将不起作用。 这些只会输出 Class ,因为类的类是

在Ruby on Rails中,DateTime,Timestamp,Time和Date之间有什么区别?

僤鯓⒐⒋嵵緔 提交于 2020-02-27 20:52:56
以我的经验,在编程时正确安排日期/时间总是充满危险和困难。 Ruby和Rails一直以来都让我望而却步,即使是由于大量的选择,也是如此。 我从来不知道该选哪个。 当我使用Rails并查看ActiveRecord数据类型时,我可以找到以下内容 :datetime,:timestamp,:time和:date 而且不知道它们之间的差异是什么或陷阱潜伏在哪里。 有什么不同? 你用它们做什么? (PS我正在使用Rails3) #1楼 ActiveRecord中不同日期/时间格式之间的差异与Rails无关,而与所使用的任何数据库无关。 以MySQL为例(如果没有其他原因,因为它最受欢迎),则具有 DATE , DATETIME , TIME 和 TIMESTAMP 列数据类型; 就像您拥有 CHAR , VARCHAR , FLOAT 和 INTEGER 。 所以,你问,有什么区别? 好吧,其中有些是不言自明的。 DATE 仅存储日期, TIME 仅存储日期,而 DATETIME 两者都存储。 DATETIME 和 TIMESTAMP 之间的区别更加细微: DATETIME 的格式设置为 YYYY-MM-DD HH:MM:SS 。 有效范围是从1000年到9999年(以及介于两者之间的所有时间。从数据库中获取的 TIMESTAMP 看起来很 相似,但实际上它只是 unix时间戳的 开头

如何在Ruby on Rails ActiveRecord迁移中处理太长的索引名?

笑着哭i 提交于 2020-02-27 14:01:30
我试图添加从四个关联表的外键创建的唯一索引: add_index :studies, ["user_id", "university_id", "subject_name_id", "subject_type_id"], :unique => true 数据库对索引名称的限制导致迁移失败。 这是错误消息: 表“研究”上的索引名称“ index_studies_on_user_id_and_university_id_and_subject_name_id_and_subject_type_id”太长; 限制为64个字符 我该如何处理? 我可以指定其他索引名称吗? #1楼 与上一个答案类似:只需在常规的add_index行中使用“名称”键: def change add_index :studies, :user_id, name: 'my_index' end #2楼 你也可以 t.index([:branch_id, :party_id], unique: true, name: 'by_branch_party') 就像 Ruby on Rails API中一样 。 #3楼 在PostgreSQL中, 默认 限制是63个字符 。 因为索引名称必须唯一,所以有一些约定是很好的。 我使用(我调整了示例以解释更复杂的结构): def change add_index :studies

当猴子修补实例方法时,可以从新的实现中调用重写的方法吗?

夙愿已清 提交于 2020-02-27 13:01:54
假设我是猴子在类中修补方法,那么如何从覆盖方法中调用覆盖方法? 即有点像 super 例如 class Foo def bar() "Hello" end end class Foo def bar() super() + " World" end end >> Foo.new.bar == "Hello World" #1楼 必须在包含原始方法的类之后重新加载将进行覆盖的类,因此请在进行覆盖的文件中 require 它。 #2楼 看一下别名方法,这是将方法重命名为新名称的一种。 有关更多信息和起点,请参阅此 替代方法文章 (尤其是第一部分)。 Ruby API docs ,也提供了(不太复杂)的示例。 #3楼 编辑 :距离我最初写这个答案已有9年了,它值得进行一些整容手术以保持最新。 您可以在 此处 查看修改之前的最新版本。 您不能通过名称或关键字来调用 覆盖的 方法。 这就是为什么应该避免猴子修补而首选继承的许多原因之一,因为显然您 可以 调用 重写 方法。 避免猴子打补丁 遗产 因此,如果可能的话,您应该喜欢这样的东西: class Foo def bar 'Hello' end end class ExtendedFoo < Foo def bar super + ' World' end end ExtendedFoo.new.bar # => 'Hello World'

rails中字符串和文本之间的区别?

早过忘川 提交于 2020-02-27 11:36:06
我正在使用Rails创建一个新的Web应用程序,并且想知道, string 和 text 之间有什么区别? 什么时候应该使用? #1楼 如上所述,不仅仅是db数据类型,如果你是脚手架,它也会影响将生成的视图。 string会生成一个text_field文本,会生成一个text_area #2楼 字符串,如果大小固定,小,文本,如果它是可变的和大的。 这很重要,因为文本比字符串大。 它包含更多的千字节。 所以对于小字段总是使用字符串(varchar)。 字段如。 first_name,登录,电子邮件,主题(文章或帖子)和文本示例:帖子或文章的内容/正文。 段落的字段等 字符串大小1到255(默认值= 255) 文字大小1至4294967296(默认= 65536)2 #3楼 字符串转换为数据库中的“Varchar”,而文本转换为“text”。 varchar可以包含更少的项目,文本可以(几乎)任何长度。 有关参考资料的深入分析,请 访问http://www.pythian.com/news/7129/text-vs-varchar/ 编辑: 某些数据库引擎可以一次加载 varchar ,但将文本(和blob)存储在表之外。 使用 text 作为 name 时,使用 varchar 时, SELECT name, amount FROM products 可能会慢得多。

Rails DB迁移-如何删除表?

心已入冬 提交于 2020-02-27 09:31:11
我添加了一个我认为自己需要的表,但现在不再计划使用它。 我应该如何删除那张桌子? 我已经运行了迁移,因此该表位于数据库中。 我认为 rails generate migration 应该能够解决这个问题,但是我还没有弄清楚如何解决。 我试过了: rails generate migration drop_tablename 但这只是一个空的迁移。 在Rails中删除表的“官方”方法是什么? #1楼 虽然此处提供的答案正常工作,但我想要更多“简单易懂”的东西,但我在这里找到了它: 链接 首先进入rails console: $rails console 然后输入: ActiveRecord::Migration.drop_table(:table_name) 完成了,为我工作! #2楼 打开Rails控制台 ActiveRecord::Base.connection.execute("drop table table_name") #3楼 我需要删除迁移脚本以及表本身... class Util::Table < ActiveRecord::Migration def self.clobber(table_name) # drop the table if ActiveRecord::Base.connection.table_exists? table_name puts "\n=

如何在Rails 3.1中禁用资产管道(链轮)消息的记录?

对着背影说爱祢 提交于 2020-02-27 08:27:00
默认情况下,在Rails 3.1(RC1)下,链接在(dev)日志中往往非常冗长: Started GET "/assets/application.css" for 127.0.0.1 at 2011-06-10 17:30:45 -0400 Compiled app/assets/stylesheets/application.css.scss (5ms) (pid 6303) Started GET "/assets/application.js" for 127.0.0.1 at 2011-06-10 17:30:45 -0400 Compiled app/assets/stylesheets/default.css.scss (15ms) (pid 6303) ... Started GET "/assets/default/header_bg.gif" for 127.0.0.1 at 2011-06-10 17:30:45 -0400 Served asset /default/header_logo.gif - 304 Not Modified (7ms) (pid 6303) Served asset /default/header_bg.gif - 304 Not Modified (0ms) (pid 6246) Served asset /default

Ruby的双冒号`::`是什么?

丶灬走出姿态 提交于 2020-02-27 06:31:05
这是什么双冒号 :: ? 例如 Foo::Bar 。 我找到一个 定义 : :: 是一元运算符,它允许在类或模块之外定义的任何位置访问常量,实例方法和类方法。 如果仅使用 :: 公开任何内容,范围(私有,受保护)有什么用? #1楼 Ruby on rails使用::进行名称空间解析。 class User < ActiveRecord::Base VIDES_COUNT = 10 Languages = { "English" => "en", "Spanish" => "es", "Mandarin Chinese" => "cn"} end 要使用它: User::VIDEOS_COUNT User::Languages User::Languages.values_at("Spanish") => "en" 另外,其他用法是:使用嵌套路由时 OmniauthCallbacksController 在用户下定义。 路线就像: devise_for :users, controllers: {omniauth_callbacks: "users/omniauth_callbacks"} class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController end #2楼 module

docker 下使用gitlab

喜你入骨 提交于 2020-02-27 04:56:56
创建环境 cd ~ mkdir gitlab cd gitlab/ mkdir etc log data 运行 docker run \ --detach \ --publish 8443:443 \ --publish 8090:80 \ --publish 8022:22 \ --name gitlab \ --restart unless-stopped \ --hostname 10.1.16.140 \ -v $PWD/etc:/etc/gitlab \ -v $PWD/log:/var/log/gitlab \ -v $PWD/data:/var/opt/gitlab \ -v /etc/localtime:/etc/localtime:ro \ gitlab/gitlab-ce 添加邮件配置,qqmail sudo vi ~/gitlab/etc/gitlab.rb #搜索找到包含smtp的,被全部注释掉的一段,再下面贴入,邮件账号和密码按实际填写 gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.exmail.qq.com" gitlab_rails['smtp_port'] = 465 gitlab_rails['smtp_user_name'] = "1@1.com"

可以在模型中使用Rails路由助手(即mymodel_path(模型))吗?

大憨熊 提交于 2020-02-26 17:33:30
假设我有一个名为Thing的Rails模型。 Thing有一个url属性,可以 选择 将其设置为Internet上的某个URL。 在视图代码中,我需要执行以下操作的逻辑: <% if thing.url.blank? %> <%= link_to('Text', thing_path(thing)) %> <% else %> <%= link_to('Text', thing.url) %> <% end %> 视图中的这种条件逻辑很难看。 当然,我可以构建一个辅助函数,它会将视图更改为: <%= thing_link('Text', thing) %> 这解决了冗长问题,但我真的更喜欢模型本身的功能。 在这种情况下,视图代码将是: <%= link_to('Text', thing.link) %> 显然,这需要模型上的链接方法。 这是它需要包含的内容: def link (self.url.blank?) ? thing_path(self) : self.url end 就问题而言,thing_path()是Model代码中未定义的方法。 我假设可以将一些辅助方法“拉入”模型中,但是如何? 是否有一个真正的原因,路由只在控制器上运行并查看应用层? 我可以想到许多模型代码可能需要处理URL(与外部系统集成等)的情况。 #1楼