Как запросить объект из одной модели, начиная с другой модели? Ruby - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь создать ассоциацию, которая не работает. У меня есть следующая область действия:

ActiveRecord::Schema.define(version: 2020_04_05_125812) do

  create_table "accounts", force: :cascade do |t|
    t.string "social_network"
    t.string "name_account"
    t.integer "person_id", null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["person_id"], name: "index_accounts_on_person_id"
  end

  create_table "lists", force: :cascade do |t|
    t.string "name"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

  create_table "lists_people", id: false, force: :cascade do |t|
    t.integer "list_id", null: false
    t.integer "person_id", null: false
  end

  create_table "people", force: :cascade do |t|
    t.string "name"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

  create_table "posts", force: :cascade do |t|
    t.string "post_text"
    t.date "date"
    t.string "link"
    t.integer "account_id", null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["account_id"], name: "index_posts_on_account_id"
  end

  add_foreign_key "accounts", "people"
  add_foreign_key "posts", "accounts"
end

Я могу sh Я мог бы проконсультироваться, например: Я хочу проконсультироваться с человеком с именем "Test_name"

Этот человек принадлежит спискам, который это собрание людей. Кроме того, у этого человека есть учетные записи, а у этих учетных записей есть сообщения.

class List < ApplicationRecord
    has_and_belongs_to_many :people  

end

class Person < ApplicationRecord
 has_and_belongs_to_many :lists
end

class Account < ApplicationRecord
  has_many :posts
  belongs_to :person

end


class Post < ApplicationRecord
  belongs_to :account 
end

Как я могу получить возврат, как показано ниже:

List | Name      | social_network
1    | Test_name | facebook
2    | Test_name | twitter

Все запросы, которые я делаю, либо возвращают неправильный тип или вернуть только список. Проблемы, такие как:

List | Name          | social_network
1    | Test_name     | facebook
2    | Test_name     | twitter
1    | Second_name   | twitter

И я не хочу видеть данные "second_name"

Я пытаюсь это:

@lists = List.from(
    Person.left_outer_joins(:list).where('people.name LIKE ?',  "Renata Rempel"),
    :list
  )

но, не работает = /

1 Ответ

0 голосов
/ 06 апреля 2020

Для начала вы хотите установить связь «многие ко многим» между человеком и списком. Это можно сделать с помощью has_and_belongs_to_many, но существует множество причин, по которым has_many through: может быть лучшим выбором . Основным из них является то, что он позволит вам добавить такие функции, как отслеживание заблокированных пользователей или когда пользователь присоединился к списку.

# rails g model list_membership member:belongs_to user:belongs_to
class ListMembership < ApplicationRecord
  belongs_to :member, class_name: 'Person'
  belongs_to :list
end

Затем мы должны исправить внешний ключ в ассоциации:

class CreateListMemberships < ActiveRecord::Migration[6.0]
  def change
    create_table :list_memberships do |t|
      t.belongs_to :list, null: false, foreign_key: true
      t.belongs_to :member, null: false, foreign_key: { to_table: :people }
      t.timestamps
    end
    # can be a good idea to add a compound index
    # add_index [:list_id, :member_id], unique: true
  end
end

class Person < ApplicationRecord
  has_many :list_memberships, foreign_key: :member_id
  has_many :lists, through: :list_memberships
  has_many :accounts
  has_many :posts, through: :accounts
end

class List
  has_many :list_memberships
  has_many :members, 
     through: :list_memberships
end

Ваш запрос from не будет работать, поскольку вы фактически выбираете строки из people, но вы просто используете псевдоним таблицы lists. Это волшебным образом не выберет правильные данные! Если вы действительно хотите использовать от вас, сделайте следующее:

List.from(
  List.joins(:members).where("people.name LIKE ?", "Renata Rempel"),
  :lists
).eager_load(members: :posts)

Если вы хотите создать группу списков со случайным числом членов в вашем начальном файле, вы можете просто сделать:

ids = 10.times.map do
  Person.create!(name: Faker::Name.name).id
end
lists = 10.times.do
  List.create!(member_ids: ids.sample(2))
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...