在RubyonRails SQL请求中使用:include&:条件?
嘿,我在想办法 我想让所有的购物车都有一个购物车阶段。阶段等于'35',这是一个单独的表和购物车有许多阶段 cart_舞台台有点像 id--购物车\购物车id--舞台 1 ---- 123 ----- 20 2 ---- 123 ----- 35 3---102---35 我现在正在尝试:在RubyonRails SQL请求中使用:include&:条件?,sql,ruby-on-rails,ruby,request,Sql,Ruby On Rails,Ruby,Request,嘿,我在想办法 我想让所有的购物车都有一个购物车阶段。阶段等于'35',这是一个单独的表和购物车有许多阶段 cart_舞台台有点像 id--购物车\购物车id--舞台 1 ---- 123 ----- 20 2 ---- 123 ----- 35 3---102---35 我现在正在尝试: # Cart model has_one :top_stage, :foreign_key => 'cart_id', :class_name => "CartStage", :order
# Cart model
has_one :top_stage, :foreign_key => 'cart_id', :class_name => "CartStage", :order => 'stage'
# Cart controller
@carts = Cart.find :all, :order => 'created_at DESC', :include => :top_stage, :conditions => ["top_stage.stage = ?", 35]
这给了我:
SQLite3::SQLException: no such column: top_stage.stage: SELECT DISTINCT "carts".id FROM "carts" WHERE (top_stage.stage = 35) ORDER BY created_at DESC LIMIT 40 OFFSET 0
希望这一切都有意义,我们将非常感谢您的帮助
亚历克斯这可能是:
@carts = Cart.find(:all, :order => 'carts.created_at DESC', :include => :top_stage, :conditions => { "cart_stages.stage" => 35 })
请记住,您在条件中使用表的名称,而不是关联的名称,但是在include选项中使用关联的名称
只要有可能,您可能应该使用哈希方法来表示条件,以保持声明的简单性。当您需要复杂的OR>类型逻辑时,阵列样式才被证明是必要的
对于Rails 3,更好的表达方式是:
@carts = Cart.order('carts.created_at DESC').include(:top_stage).where('top_stages.stage' => 35)
不清楚为什么您的cart_stages表没有添加联接。任何包含文字SQL的地方,都需要使用实际的表名和列名,而不是Rails关联名。所以你需要有::conditions=>[cart_stage.stage=?,35]而不是top_stage我自己设法解决了这个问题。。我想要的是-
@carts = Cart.find :all, :order => 'created_at DESC', :joins => :top_stage, :conditions => { :cart_stages => { :stage => 35 } }
谢谢大家的帮助 您使用的是什么版本的rails?这给了我:SQLite3::SQLException:没有这样的列:cart\u stages.id:SELECT carts。。。。您将如何使用连接,我对ruby中的DB请求有点经验!我正在使用Railsv2.3.8顺便说一句!谢谢你迄今为止的帮助!顺便说一句,SQL错误消息较长,但我无法全部发布,因为它太长,无法放入框中!