小编Jas*_*son的帖子

Arel,Joins和Rails查询

我最近在一段时间内遇到了一个问题,并找到了我去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)

join arel ruby-on-rails-3

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

第一代后修改设计模块

我正在学习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

migration ruby-on-rails devise ruby-on-rails-3

7
推荐指数
2
解决办法
1672
查看次数

标签 统计

ruby-on-rails-3 ×2

arel ×1

devise ×1

join ×1

migration ×1

ruby-on-rails ×1