Rails - 使用has_many&在不同模型中查询一个模型belongs_to关系

时间:2013-03-01 13:55:06

标签: ruby-on-rails ruby

我不清楚如何从Rails中的不同模型中查询模型数据。这些模型有一个has_many& belongs_to关系。这两个型号是“Gear”和“line_item”。 齿轮 has_many line_items和 LineItem belongs_to Gear。

我要做的是查询数据库中属于Gear对象的所有line_items,这些对象具有NULL或Blank cart_id(这是其中一个字段),然后计算它的可用性。因为在这种情况下,Gear在某些日期和时间出租,这些日期和时间存储在line_item(start_date,end_date,start_hour,end_hour)中。但是我没有在Ruby中进行很多高级查询我用Google搜索,现在我不是确定我应该如何使用

在Gear Model中可以使用类似的东西:

line_items.inject(0) {|line_item| line_item.where('line_items.cart_id' => NULL }

或者如果我可以在Gear Model中使用这样的范围:

scope :availablegear, lambda { includes(:line_items).where('line_items.cart_id' => nil) }

我知道两者的语法可能都不正确所以我可以使用一些方向来使用它以及如何使用它。

感谢。

MY Project正在使用Rails 3.2.0,Ruby 1.9.4& MySQL的

使用建议的答案进行编辑

class Gear < ActiveRecord::Base
  attr_accessible :title, :size, :price, :sub_category_id, :user_id, :image, :image_a, :image_b, :image_c, :image_d, :image_e, :image_f, :image_g, :image_h, :image_i, :remote_image_url, :color, :year, :latefee, :cancellation, :minrental, :policy, :about, :address, :city, :state, :zip, :country, :latitude, :longitude, :gmaps
  ...some code omitted for brevity
  has_many :line_items
  scope :availablegear, joins(:line_items).where(:line_items => {:cart_id => nil})
  ...some code omitted for brevity

end

现在,当我启动Rails控制台并执行ag = Gear.find(4)然后执行g.availablegear时出现以下错误: NoMethodError:未定义的方法`availablegear'用于# < / p>

2 个答案:

答案 0 :(得分:4)

我认为您正在寻找的查询是

Gear.joins(:line_items).where(:line_items => {:cart_id => nil})

您可以将其放在Gear类的范围内:

class Gear< ActiveRecord::Base
  scope :available, joins(:line_items).where(:line_items => {:cart_id => nil})
end

您可以在Rails Query Guide中找到更多帮助(有关加入条件,请参阅11.3)。

答案 1 :(得分:2)

如果你想要收回订单项:

class Gear < ActiveRecord::Base
  has_many :line_items
end

class LineItem < ActiveRecord::Base
  belongs_to :gear

  scope :available, where(:cart_id => nil)
end

然后,如果你有装备,你可以打电话

gear.line_items.available

将返回属于gear但没有cart_id的订单项。