Я очень мало узнал о том, как можно писать области для полиморфных ассоциаций в рельсах, не говоря уже о том, как писать запросы на полиморфные ассоциации.
В документации Rails я просмотрел раздел Полиморфные ассоциации, раздел "Соединительные таблицы" и раздел "Области" . Я также сделал свою долю в googling.
Возьмите эту настройку, например:
class Pet < ActiveRecord::Base
belongs_to :animal, polymorphic: true
end
class Dog < ActiveRecord::Base
has_many :pets, as: :animal
end
class Cat < ActiveRecord::Base
has_many :pets, as: :animal
end
class Bird < ActiveRecord::Base
has_many :pets, as: :animal
end
Итак, Pet
может быть animal_type
"Собака", "Кошка" или "Птица".
Чтобы показать все структуры таблицы: вот мой schema.rb:
create_table "birds", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "cats", force: :cascade do |t|
t.integer "killed_mice"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "dogs", force: :cascade do |t|
t.boolean "sits"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "pets", force: :cascade do |t|
t.string "name"
t.integer "animal_id"
t.string "animal_type"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
Затем я пошел вперед и сделал несколько записей:
Dog.create(sits: false)
Dog.create(sits: true)
Dog.create(sits: true) #Dog record that will not be tied to a pet
Cat.create(killed_mice: 2)
Cat.create(killed_mice: 15)
Cat.create(killed_mice: 15) #Cat record that will not be tied to a pet
Bird.create
И затем я пошел и сделал несколько записей Pet
:
Pet.create(name: 'dog1', animal_id: 1, animal_type: "Dog")
Pet.create(name: 'dog2', animal_id: 2, animal_type: "Dog")
Pet.create(name: 'cat1', animal_id: 1, animal_type: "Cat")
Pet.create(name: 'cat2', animal_id: 2, animal_type: "Cat")
Pet.create(name: 'bird1', animal_id: 1, animal_type: "Bird")
И это настройка! Теперь сложная часть: я хочу создать некоторые области применения модели Pet
, которые выкапывают в полиморфные ассоциации.
Вот несколько областей, которые я бы хотел написать:
- Дайте мне все
Pets
animal_type == "Собака", которая может сидеть - Дайте мне все
Pets
animal_type == "Cat", которые убили не менее 10 мышей. - Дайте мне все
Pets
, которые не являются как animal_type "Dog", так и не могут сидеть. (Другими словами: Дайте мне всех домашних животных: все они: кроме собак, которые не могут сидеть).
Итак, в моей модели Pet
я хотел бы разместить там свои области:
class Pet < ActiveRecord::Base
belongs_to :animal, polymorphic: true
scope :sitting_dogs, -> {#query goes here}
scope :killer_cats, -> {#query goes here}
scope :remove_dogs_that_cannot_sit, -> {#query goes here} #only removes pet records of dogs that cannot sit. All other pet records are returned
end
Мне сложно писать эти области.
Некоторые вещи, которые я нашел в Интернете, показывают, что вы можете только записывать эти области с помощью raw SQL. Мне интересно, можно ли вместо этого использовать синтаксис Hash для этих областей.
Любые советы/помощь будут очень благодарны!