Rails where子句需要通过另一个表查找记录

时间:2014-10-29 00:28:49

标签: ruby-on-rails activerecord associations

我有4张桌子

  • 品牌
  • 电机
  • boat_motor_packages

品牌has_many马达

电机属于一个品牌

boat_motor_package属于船只和马达

一艘船has_many boat_motor_packages

我需要做两件事

  1. 列出每艘boat_motor_package的品牌
  2. 列出与每个品牌相关联的boat_motor_packages
  3. 例如,

    我有一条船

    我有2个品牌 - “evinrude”和“mercury”

    我有4个电机,每个品牌2个

    以下是我希望它在我的视图模板中查看的方式

    埃文鲁德

    • 50HP
    • 60HP

    • 55hp
    • 65hp

    这是我的控制器动作

    def show
      @boat = Boat.find(params[:id])
      packages = BoatMotorPackage.where(boat: @boat).all
    
      @package_motor_brands = packages.map { |p| p.motor.brand }
    end
    

    @package_motor_brands给了我所需的所有品牌

    现在我需要找到与船和motor.brand相关的电机包。

    我试图做这样的事情:

    -@boat.motor_packages(brand).each do |motor_package|
    

    并在Boat类中创建一个如下所示的方法:

    def motor_packages(brand)
      BoatMotorPackage.where(["boat => ? and motor.brand => ?", self, brand])
    end
    

    但这不起作用。我收到错误,说motor.brand列不存在。这是真的,因为它在电机桌上很实用。有谁知道这样做的正确方法?

    这是我的观点,这有助于

    - @package_motor_brands.each do |brand|
                                  .col-xs-6.motor-group-container
                                    %h5= brand.name
                                    -@boat.motor_packages(brand).each do |motor_package|
                                    .row
                                      .col-xs-12.motor-group
                                        %label.motor-group-name 
                                          %input#motorPackageRadios1{:name => "motorPackages", :type => "radio", :value => "#{motor_package.id}"}/
                                          ="#{motor_package.motor.hp.to_s}HP #{motor_package.motor.motor_type}"
                                        .motor-group-price="#{motor_package.price_in_cents}"
    

1 个答案:

答案 0 :(得分:-1)

如果您正在关注Rails约定,则包含Motor条记录的表格将被称为motors(复数),而不是motor(单数)。