我最近在一段时间内遇到了一个问题,并找到了我去Arel的路,看起来它应该允许我在我的查询中做OR.
作为一个起点,我需要将现有的Rails 3查询转换为Arel,这就是我遇到问题的地方.
以下范围和查询按我的预期工作.它向我提供了与特定用户广告相关的请求.
#in the Request class
scope :responder, lambda { |user| joins(:ad).where(:ads => { :user_id => user }) }
Request.responder(303).to_sql
=> "SELECT \"requests\".* FROM \"requests\" INNER JOIN \"ads\" ON \"ads\".\"id\" = \"requests\".\"ad_id\" WHERE (\"ads\".\"user_id\" = 303)"
Run Code Online (Sandbox Code Playgroud)
根据Arel github页面和Railscast 215上的doco,我应该可以执行以下操作来使用Arel复制查询
requests = Request.arel_table
ads = Ad.arel_table
where(requests.join(ads).on(ads[:id].eq(requests[:ad_id])))
Run Code Online (Sandbox Code Playgroud)
这会导致错误
TypeError: Cannot visit Arel::SelectManager
Run Code Online (Sandbox Code Playgroud)
我可以在控制台中执行以下操作
r = Request.arel_table
a = Ad.arel_table
r.join(a).to_sql
=> "SELECT FROM \"requests\" INNER JOIN \"ads\" "
Run Code Online (Sandbox Code Playgroud)
所以看起来它正在形成SQL请求,但是当你把它放在哪里时
Request.where(r.join(a)).to_sql
Run Code Online (Sandbox Code Playgroud)
我得到以下内容
TypeError: Cannot visit Arel::SelectManager....
Run Code Online (Sandbox Code Playgroud)
我已经尝试在其中进行其他Arel动作并且它有效(例如)
Request.where(r[:status].eq(nil)).to_sql
=> "SELECT …
Run Code Online (Sandbox Code Playgroud) 我正在学习rails.我发现Devise非常适合快速无缝地进行身份验证,但我确实有一个问题.
如何在第一次运行Devise发生器后更改模块(例如rails g devise User)?此默认值为以下迁移:
def self.up
create_table(:users) do |t|
t.database_authenticatable :null => false
t.recoverable
t.rememberable
t.trackable
# t.confirmable
# t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both
# t.token_authenticatable
t.timestamps
end
add_index :users, :email, :unique => true
add_index :users, :reset_password_token, :unique => true
# add_index :users, :confirmation_token, :unique => true
# add_index :users, :unlock_token, :unique => true
end
Run Code Online (Sandbox Code Playgroud)
如果我运行此迁移,如何在以后添加/删除其中一些模块?例如,也许我想为现有的用户模型添加可锁定功能.我理解如何在模型中进行更改,devise.rb
但我不确定如何处理迁移.
抱歉,如果答案已经在这里,我已经在这里和谷歌拖了几个小时,找不到任何东西.也许我正在寻找错误的东西.
提前致谢!
杰森
ps.我正在使用
rails 3.0.0
设计1.1.3