标签: activerecord

如何强制ActiveRecord重新加载一个类?

我正在创建一系列迁移,其中一些是标准的"创建表"或"修改表"迁移,其中一些迁移修改数据.我正在使用我的实际ActiveRecord模型来修改数据,a:

Blog.all.each do |blog|
  update_some_blog_attributes_to_match_new_schema
end
Run Code Online (Sandbox Code Playgroud)

问题是,如果我加载Blog类,然后修改表,然后再次使用Blog类,模型具有旧的表定义,并且无法保存到新表.有没有办法重新加载类及其属性定义,以便我可以重用它们?

ruby migration activerecord ruby-on-rails

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

你如何在Rails 3中调整ActiveRecord关联的范围?

我有一个Rails 3项目.有了Rails 3,Arel就能够重用一个范围来构建另一个范围.我想知道在定义关系时是否有办法使用范围(例如"has_many").

我有记录,其中有权限列.我想构建一个default_scope,它将我的权限列考虑在内,以便过滤记录(甚至通过关系访问的记录).

目前,在Rails 3中,default_scope(包括我发现的补丁)没有提供传递proc的可行方法(我需要后期变量绑定).是否可以定义一个可以传递命名范围的has_many?

重用命名范围的想法如下:

Orders.scope :my_orders, lambda{where(:user_id => User.current_user.id)}
has_many :orders, :scope => Orders.my_orders
Run Code Online (Sandbox Code Playgroud)

或隐式编码关系中命名范围的内容如下所示:

has_many :orders, :scope => lambda{where(:user_id => User.current_user.id)}
Run Code Online (Sandbox Code Playgroud)

我只是尝试将default_scope应用于后期绑定.我更喜欢使用Arel方法(如果有的话),但会使用任何可行的选项.

由于我指的是当前用户,因此我不能依赖于最后一刻未评估的条件,例如:

has_many :orders, :conditions => ["user_id = ?", User.current_user.id]
Run Code Online (Sandbox Code Playgroud)

activerecord named-scope ruby-on-rails arel ruby-on-rails-3

59
推荐指数
5
解决办法
8万
查看次数

有一种简单的方法可以将Rails ActiveRecord模型设为只读吗?

我希望能够在数据库中创建一个记录,但后来阻止Rails从那一点开始进行更改.我知道在数据库级别仍然可以进行更改.

我相信attr_readonly在属性级别上做我想要的,但我不想手动指定字段...我宁愿有更多的白名单方法.

此外,我知道有一个:read_only选项用于关联,但我不想限制对象的"readonlyness",如果它是通过关联获取的.

最后,我希望能够仍然销毁一条记录,例如:dependent =>:destroy在关联中起作用.

因此,总结一下:1)允许创建记录,2)允许删除记录,3)防止更改已保留的记录.

activerecord ruby-on-rails ruby-on-rails-3

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

使用codeigniter的活动记录语法增加mysql数据库的字段

我有以下php-codeigniter脚本,它尝试使用活动记录语法递增记录的字段:

$data = array('votes' => '(votes + 1)');
$this->db->where('id', $post['identifier']);
$this->db->update('users', $data);
Run Code Online (Sandbox Code Playgroud)

这会产生以下SQL:

"UPDATE用户SET投票= '(votes + 1)' WHEREID = '44'"

哪个不运行,但是这个SQL确实做了我正在寻找的东西: "UPDATE用户SET投票= (votes + 1) WHEREID = '44'"`< - 注意缺少引号(投票+ 1)

有没有人知道如何使用codeigniter的活动记录语法实现这种类型的查询?

mysql sql activerecord codeigniter

59
推荐指数
1
解决办法
4万
查看次数

Rails 3 ActiveRecord:按关联计数排序

我有一个名为的模型Song.我也有一个名为的模型Listen.A Listen belongs_to :song,和一首歌:has_many listens(可以多次收听).

在我的模型中,我想定义一个方法self.top,该方法应该返回最多听过的前5首歌曲.如何使用这种has_many关系实现这一目标?

我正在使用Rails 3.1.

谢谢!

mysql activerecord ruby-on-rails ruby-on-rails-3

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

如何找到ActiveRecord ROLLBACK的原因

在我看到的日志中ROLLBACK,但没有记录任何异常.有没有办法找出导致ROLLBACK的原因?

这是日志的摘录:

  Phone Load (0.4ms)  SELECT "phones".* FROM "phones" WHERE "phones"."id" = $1 LIMIT 1  [["id", 980190963]]
   (0.2ms)  BEGIN
  User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."phone_id" = 980190963 LIMIT 1
   (0.2ms)  ROLLBACK
  Phone Load (0.4ms)  SELECT "phones".* FROM "phones" WHERE "phones"."id" = $1 LIMIT 1  [["id", 980190963]]
  User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."phone_id" = 980190963 LIMIT 1
Run Code Online (Sandbox Code Playgroud)

activerecord ruby-on-rails

59
推荐指数
4
解决办法
3万
查看次数

如何使用rails控制台从表中删除列

使用rails迁移很容易删除列.

class SomeClass < ActiveRecord::Migration
  def self.up
    remove_column :table_name, :column_name
  end
end
Run Code Online (Sandbox Code Playgroud)

我想知道是否有任何方法可以使用控制台从表中删除列.

activerecord ruby-on-rails rails-migrations ruby-on-rails-3.2

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

Rails ActiveRecord:查找当前用户以外的所有用户

我觉得这应该很简单,但我的大脑正在短路.如果我有表示当前用户的一个对象,并希望查询除了当前用户的所有用户,我怎么能做到这一点,考虑到当前用户有时会nil

这就是我现在正在做的事情:

def index
  @users = User.all
  @users.delete current_user
end
Run Code Online (Sandbox Code Playgroud)

我不喜欢的是我正在对查询结果进行后处理.除了感觉有点不对外,如果我将查询转换为运行,我认为这不会很好will_paginate.有关如何使用查询执行此操作的任何建议?谢谢.

ruby activerecord ruby-on-rails

58
推荐指数
5
解决办法
5万
查看次数

rename_column会处理索引吗?

说,我们有这样的事情:

add_column :users, :single, :boolean
add_index :users, :single
Run Code Online (Sandbox Code Playgroud)

然后我们做

rename_column :users, :single, :married
Run Code Online (Sandbox Code Playgroud)

ActiveRecord和/或数据库是否也会处理索引的重命名,还是我必须手动删除索引并再次添加它?

activerecord ruby-on-rails database-indexes ruby-on-rails-3 rails-activerecord

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

ActiveRecord Arel OR条件

如何使用逻辑OR而不是AND组合2个不同的条件?

注意:作为轨道范围生成2个条件,并且不能轻易地将其更改为where("x or y")直接类似的条件.

简单的例子:

admins = User.where(:kind => :admin)
authors = User.where(:kind => :author)
Run Code Online (Sandbox Code Playgroud)

它很容易应用和条件(对于这个特殊情况是没有意义的):

(admins.merge authors).to_sql
#=> select ... from ... where kind = 'admin' AND kind = 'author'
Run Code Online (Sandbox Code Playgroud)

但是,如何生成具有2种不同Arel关系的以下查询?

#=> select ... from ... where kind = 'admin' OR kind = 'author'
Run Code Online (Sandbox Code Playgroud)

似乎(根据Arel自述文件):

OR运算符尚不支持

但是我希望它不适用于此并期望写出如下内容:

(admins.or authors).to_sql
Run Code Online (Sandbox Code Playgroud)

ruby sql activerecord ruby-on-rails arel

58
推荐指数
4
解决办法
3万
查看次数