标签: rails-activerecord

Rails 3:将相同的验证规则应用于多个表字段

我创建了一个具有多个字段的模型,这些字段应该接受相同的数据格式(字符串,但可以是任何东西,FWIW).我想将相同的验证规则应用于所有这些字段.当然,我可以继续复制/粘贴东西,但那样会违反DRY原则,而且常识也是......

我想这个很容易,但我是一个Rails新人/时髦人士,所以请原谅一个微不足道的问题.=)

validation ruby-on-rails-3 rails-activerecord

14
推荐指数
2
解决办法
1万
查看次数

为什么我不想在任何地方使用inverse_of?

如下所述:

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

inverse_of似乎告诉Rails缓存内存关联并最小化数据库查询.他们的例子是:

 class Dungeon < ActiveRecord::Base
   has_many :traps, :inverse_of => :dungeon
   has_one :evil_wizard, :inverse_of => :dungeon
 end

 class Trap < ActiveRecord::Base
   belongs_to :dungeon, :inverse_of => :traps
 end
Run Code Online (Sandbox Code Playgroud)

他们立即遵循:

 for `belongs_to` associations `has_many` inverse associations are ignored.
Run Code Online (Sandbox Code Playgroud)

所以我有几个问题.

  1. 是负相关忽视了has_many一个belongs_to?如果是这样,他们的榜样有意义吗?它不应该不做任何事情吗?
  2. 据我所知(假设它做了什么)所有这允许做的事情是这样的:

    dungeon.traps.first.dungeon
    
    Run Code Online (Sandbox Code Playgroud)

    最后调用.dungeonNOT生成一个完整的新查询,但只是达到内存关联.假设这是正确的,为什么我不想要这种行为?为什么我不坚持inverse_of:每个协会?

ruby ruby-on-rails associations rails-activerecord

14
推荐指数
1
解决办法
1413
查看次数

使用ActiveRecord关联生成模型

伙计们,

我正在创建一个应用程序,我在我的问题空间中有两个实体.一个实体是"生物学家",另一个实体是"实验",现在一个生物学家可以进行许多实验,每个实验都可以有许多生物学家.

我知道如何使用命令行生成器创建模型和路由:

 rails generate scaffold Biologist name:string expertise:string last_pub:text
Run Code Online (Sandbox Code Playgroud)

添加关联的正确方法是什么?它是否会在生成后更新模型代码?我不清楚的是,如果我添加一个"belongs_to"关联后期生成,如何在不运行迁移的情况下在数据库模式中反映出来?在上面的例子中,如果"实验"属于"生物学家",那么"生物学家"表中将有一个外键,如果我在模型类后期生成中添加关联,将如何创建.我对rails非常陌生,所以如果这是一个天真的问题我会道歉.

ruby-on-rails rails-activerecord

14
推荐指数
2
解决办法
2万
查看次数

Rails 4关系#所有弃用

在我的应用中,我创建了最近的帖子功能.

 @recentposts = Post.all(:order => 'created_at DESC', :limit => 5)
Run Code Online (Sandbox Code Playgroud)

这个变量有些麻烦.当我运行测试时,我有以下错误:

弃用警告:不推荐使用Relation#all.如果您想要加载关系,可以调用#load(例如Post.where(published: true).load).如果要从关系中获取记录数组,可以调用#to_a(例如Post.where(published: true).to_a).(来自/home/mateusz/rails4/Bloggers/app/controllers/users_controller.rb:18上的节目)

我在Google上搜索解决方案,但我找不到它......

ruby-on-rails ruby-on-rails-4 rails-activerecord

14
推荐指数
2
解决办法
9149
查看次数

是否可以在非基于ActiveRecord的模型上使用ActiveAdmin(比如activeModel或Mongoid等)?

问题几乎说明了一切.

我有一个支持定义良好的API的现有站点.

我需要为它建立一个很好的管理界面,而且,由于我之前使用过ActiveAdmin创建效果,我很乐意在这里使用它.

但是,我找不到有关是否可以这样做的任何细节.

我读过评论说AA支持ActiveModel类型的对象,它们不一定要基于ActiveRecord,但我已经不用自己尝试了,或者找到了这样的例子.

任何人都知道这是否可能?

ruby activerecord activeadmin rails-activerecord

14
推荐指数
2
解决办法
2742
查看次数

Rails原始查询csv格式,通过控制器返回

我正在使用活动记录来获取我的故事,然后生成CSV,这是在rails cast中完成的标准方式.但我有很多行,需要几分钟.我想如果我能让posgresql做csv渲染,那么我可以节省一些时间.

这是我现在所拥有的:

query = "COPY stories TO STDOUT WITH CSV HEADER;"
results = ActiveRecord::Base.connection.execute(query);
Run Code Online (Sandbox Code Playgroud)

但是此查询的结果为空:

 => #<PG::Result:0x00000006ea0488 @connection=#<PG::Connection:0x00000006c62fb8 @socket_io=nil, @notice_receiver=nil, @notice_processor=nil>> 
2.0.0-p247 :053 > result.count
 => 0 
Run Code Online (Sandbox Code Playgroud)

更好的了解方式:

2.0.0-p247 :059 >   result.to_json
 => "[]" 
Run Code Online (Sandbox Code Playgroud)

我怀疑我的控制器看起来像这样:

format.csv { send_data raw_results }
Run Code Online (Sandbox Code Playgroud)

这适用于普通查询,我只是无法弄清楚将CSV结果返回到rails的SQL语法.

UPDATE

CSV输出从120000毫秒下降到290毫秒

我的模特:

def self.to_csv(story_ids)

    csv  = []
    conn = ActiveRecord::Base.connection.raw_connection
    conn.copy_data("COPY (SELECT * FROM stories WHERE stories.id IN (#{story_ids.join(',')})) TO STDOUT WITH (FORMAT CSV, HEADER TRUE, FORCE_QUOTE *, ESCAPE E'\\\\');") do
      while row = conn.get_copy_data
        csv.push(row)
      end …
Run Code Online (Sandbox Code Playgroud)

csv postgresql pg ruby-on-rails-4 rails-activerecord

14
推荐指数
1
解决办法
3360
查看次数

创建失败时Ruby on Rails Active Record返回值?

我是ruby on rails的新手,无法完成这项工作.基本上我有一个用户注册页面,其中有密码确认.在User类中,我有以下验证:

validates :password, confirmation: true
Run Code Online (Sandbox Code Playgroud)

在控制器中我有

def create
    vals = params[:user]
    if(User.exists(vals[:username])) 
        flash[:warning] = "#{vals[:username]} already exists! Please try a new one. "
    else
        vals[:create_date] = DateTime.current
        user = User.create(vals, :without_protection => :true)
        if user==false or user==nil or user==vals
            flash[:warning] = "#{vals[:username]} has not been registered successfully. "
        else
            flash[:notice] = "#{vals[:username]} has been registered. "
        end
    end
    redirect_to users_path
end
Run Code Online (Sandbox Code Playgroud)

问题是,当密码确认符合时,我仍然收到通知消息,表明注册成功.正如你所看到的,我已经尝试了几个返回值,create但它们似乎都没有成功.我很确定验证是有效的,因为如果密码与确认不匹配,我就看不到我刚刚创建的用户.另外,当我使用时create!,我可以看到网站因验证错误而崩溃.任何人都可以帮助告诉我create在未经过验证的情况下应该返回什么内容吗?

谢谢.

ruby activerecord ruby-on-rails rails-activerecord

14
推荐指数
2
解决办法
2万
查看次数

通过Rails中的database_url和Unix Socket连接到Postgres

我一直在寻找这个,但是找不到解决办法.

目前我有一个database.yml成功连接到Unix套接字上的本地pgbouncer服务器.但是,我正在转换为将其设置为database_url环境变量,并且无法解决如何通过Unix套接字连接到本地Postgres服务器的问题.localhost显然工作正常.

我正在查看一个看起来像这样的URL,显然你可以在Postgres中使用它(http://www.postgresql.org/docs/9.2/interactive/libpq-connect.html):

export DATABASE_URL="postgresql://username@%Fvar%Frun%Fpostgresql%F.s.PGSQL.6432/dbname"
Run Code Online (Sandbox Code Playgroud)

但是,这不会超过URI警察:

rubies/ruby-2.1.5/lib/ruby/2.1.0/uri/common.rb:176:in `split': bad URI(is not URI?): postgresql://username@%Fvar%Frun%Fpostgresql%F.s.PGSQL.6432/dbname
Run Code Online (Sandbox Code Playgroud)

有没有人知道这需要的秘制酱?我谷歌无休止地找不到任何东西.它必须是可能的,因为应用程序当前通过套接字连接.

提前致谢,

rails-activerecord

14
推荐指数
3
解决办法
8269
查看次数

在模型之间共享枚举声明值

我在以下属性上应用枚举:transparency

在两个不同的模型中使用相同的属性(使用枚举):CategoryPost

是否可以在模型之间共享枚举值,以避免代码重复:

enum transparency: %w(anonymous private public)
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails rails-activerecord ruby-on-rails-4.2

14
推荐指数
2
解决办法
2780
查看次数

Ruby on Rails ActiveRecord范围与类方法

Rails在内部将范围转换为类方法,那么为什么我们不能自己使用类方法而不是使用范围.

ruby ruby-on-rails rails-activerecord

14
推荐指数
2
解决办法
4948
查看次数