2016-07-26 34 views
0

我的應用程序包括3種型號:對相關車型on Rails的4 Ruby中使用命名範圍

FashionModel
Measurement
ModelProfile

class FashionModel < ActiveRecord::Base 
    has_secure_password 
    has_one :model_profile 
    has_one :measurement 
    accepts_nested_attributes_for :model_profile 
    accepts_nested_attributes_for :measurement 
end 


class ModelProfile < ActiveRecord::Base 
    belongs_to :fashion_model 
end 


class Measurement < ActiveRecord::Base 
    belongs_to :fashion_model 
end 

的模式大致如下:

create_table "fashion_models", force: :cascade do |t| 
    t.string "first_name",    limit: 25 
    t.string "last_name",    limit: 25 
    t.string "email",     limit: 255, null: false 
    t.datetime "created_at",       null: false 
    t.datetime "updated_at",       null: false 
    t.string "password_digest",  limit: 255 
    t.string "password_reset_token", limit: 255 
    t.datetime "password_reset_sent_at" 
    end 

    create_table "measurements", force: :cascade do |t| 
    t.integer "fashion_model_id", limit: 4 
    t.decimal "feet",       precision: 10 
    t.decimal "inches",      precision: 10 
    t.decimal "bust",       precision: 10, default: 36 
    t.decimal "waist",      precision: 10, default: 28 
    t.decimal "hips",       precision: 10, default: 36 
    t.decimal "shoes",      precision: 10 
    t.integer "dress",   limit: 4 
    t.string "eyes",    limit: 255 
    t.string "hair",    limit: 255 
    t.datetime "created_at",            null: false 
    t.datetime "updated_at",            null: false 
    end 

    create_table "model_profiles", force: :cascade do |t| 
    t.integer "fashion_model_id", limit: 4 
    t.string "phone_number",  limit: 255 
    t.date  "birthdate" 
    t.text  "bio",    limit: 65535 
    t.string "location",   limit: 255,     default: "Venice" 
    t.string "gender",   limit: 255 
    t.decimal "rate",       precision: 10, default: 100 
    t.string "profile_picture", limit: 255 
    t.datetime "created_at",              null: false 
    t.datetime "updated_at",              null: false 
    end 

    add_index "model_profiles", ["fashion_model_id"], name: "index_model_profiles_on_fashion_model_id", using: :btree 

    add_foreign_key "bookings", "fashion_models" 
    add_foreign_key "fashion_model_photos", "fashion_models" 
end 

我正試圖根據輸入過濾出數據。例如,有人搜索一個身高爲5'8「的模型,黑色的眼睛和棕色的頭髮,我應該只通過查詢數據庫來顯示那些模型。

因此,我試圖在模型中使用命名的範圍。我不知道我該怎麼辦範圍measurement表由FashionModel模型編寫一個範圍的屬性。

我在網上看了一些資源,從我的理解,我寫的東西像

scope :eye_color, includes(:measurement).where(measurement: { eyes: "Amber" }) 

儘管我不想將Amber硬編碼到眼睛領域,但我在我的錯誤控制檯試圖訪問此範圍時。我做類似

a = FashionModel.all 
a.eye_color 

這給了我一個和ArgumentError: wrong number of arguments (given 0, expected 1)

我也試着這樣做

scope :eye_color, -> (eye_color) { where eyes: eye_color } 

,然後通過a.eye_color("Amber"),這反過來給了我一個NoMethodError: undefined method 'measurement' for Class調用它。

所以基本上我想從父模型範圍到子模型。 任何幫助非常感謝!由於

回答

2

定義你的範圍爲:

FashionModel.eye_color("Amber") 
+0

我得到一個語法錯誤'意外 ')','expecting'意外keyword_end,期待「:

scope :eye_color, ->(eye_color) { includes(:measurements).where(measurements: {eyes: eye_color}) } 

然後用像PARAM查詢}'' –

+0

我試過這樣做。它給了我類似於'SELECT'fashion_models'。'id'AS t0_r0,'fashion_models'。'first_name'AS t0_r1,'fashion_models'。'last_name'AS t0_r2'然後拋出一個錯誤: 'ActiveRecord :: StatementInvalid :Mysql2 ::錯誤:未知列'measurement.eyes'' –