我正在创建一系列迁移,其中一些是标准的"创建表"或"修改表"迁移,其中一些迁移修改数据.我正在使用我的实际ActiveRecord模型来修改数据,a:
Blog.all.each do |blog|
update_some_blog_attributes_to_match_new_schema
end
Run Code Online (Sandbox Code Playgroud)
问题是,如果我加载Blog类,然后修改表,然后再次使用Blog类,模型具有旧的表定义,并且无法保存到新表.有没有办法重新加载类及其属性定义,以便我可以重用它们?
我有一个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) 我希望能够在数据库中创建一个记录,但后来阻止Rails从那一点开始进行更改.我知道在数据库级别仍然可以进行更改.
我相信attr_readonly在属性级别上做我想要的,但我不想手动指定字段...我宁愿有更多的白名单方法.
此外,我知道有一个:read_only选项用于关联,但我不想限制对象的"readonlyness",如果它是通过关联获取的.
最后,我希望能够仍然销毁一条记录,例如:dependent =>:destroy在关联中起作用.
因此,总结一下:1)允许创建记录,2)允许删除记录,3)防止更改已保留的记录.
我有以下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的活动记录语法实现这种类型的查询?
我有一个名为的模型Song.我也有一个名为的模型Listen.A Listen belongs_to :song,和一首歌:has_many listens(可以多次收听).
在我的模型中,我想定义一个方法self.top,该方法应该返回最多听过的前5首歌曲.如何使用这种has_many关系实现这一目标?
我正在使用Rails 3.1.
谢谢!
在我看到的日志中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) 使用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
我觉得这应该很简单,但我的大脑正在短路.如果我有表示当前用户的一个对象,并希望查询除了当前用户的所有用户,我怎么能做到这一点,考虑到当前用户有时会nil?
这就是我现在正在做的事情:
def index
@users = User.all
@users.delete current_user
end
Run Code Online (Sandbox Code Playgroud)
我不喜欢的是我正在对查询结果进行后处理.除了感觉有点不对外,如果我将查询转换为运行,我认为这不会很好will_paginate.有关如何使用查询执行此操作的任何建议?谢谢.
说,我们有这样的事情:
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
如何使用逻辑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)