Запрос к базе данных - Rails

Я пытаюсь написать запрос к базе данных и ломаю голову над тем, что делаю неправильно.

Вот соответствующая модель

class User

  has_one :store
  has_many :products, through: :store

  enum gender: %i[menswear womenswear unisex] 

  def menswear
    self.gender == 'menswear'
  end

  def womenswear
    self.gender == 'womenswear'
  end

end

class Product
  belongs_to :store
end

и контроллер

class UsersController

  def index
    @male = User.menswear
    @female = User.womenswear
    @products = Product.all.order('created_at DESC')
  end

end

Вид

<% @male.products.in_groups_of(3, false).each do |group| %>
  <% for product in group %>
    <%= link_to product_path(product) do %>
      <%= image_tag product.secimage_url(:index).to_s, class: "image hide" %>
      <%= image_tag product.image_url(:index).to_s, class: "image" %>
    <% end %>
  <% end %>
<% end %>

То же самое и с женской одеждой. Но я получаю NoMethodError

undefined method 'products' for #<User::ActiveRecord_Relation:0x007fbd25e42ac0>

Обновлено: Возможно, я изначально был неясен, я хочу, чтобы в представлении были показаны товары, отсортированные по мужской и женской одежде, пожалуйста, помогите! Спасибо

Любые указатели на то, что я делаю неправильно, будут оценены. Заранее спасибо!

Миграция

Я добавил пол для пользователей позже, а не в исходной миграции

def up
    add_column :users, :gender, :integer
    add_index :users, :gender
  end

  def down
    remove_column :users, :gender
  end 

Обновлено: Я изменил пользовательский контроллер на этот

def index
  @partners = User.partner
  @male = User.find_by(gender: 0)
  @female = User.find_by(gender: 1)
end

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

Вы пытаетесь вызвать метод экземпляра User#products в отношении User.

Marek Lipka 21.03.2018 10:56

Значит, это должен быть User.store.products? @MarekLipka

Rails_learner 21.03.2018 10:58

Возможно, я не совсем понимаю рельсы, но похоже, что menswear - это метод экземпляра User. Но вы используете его как метод класса. Я не уверен, как вам вообще удалось вызвать products на @male

DickieBoy 21.03.2018 11:22

Вы можете показать мне схему базы данных или файл миграции.

Thananjaya S 21.03.2018 11:40

@Thananjaya Какой именно файл миграции?

Rails_learner 21.03.2018 12:40

Мол, будет файл 20180301_create_user.rb и 20180301_create_products.rb. Эти файлы известны как файлы миграции, которые можно найти в db/migrate/migration_file. Пожалуйста, опубликуйте.

Thananjaya S 21.03.2018 13:45

Обновлено @Thananjaya

Rails_learner 21.03.2018 14:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
7
44
2

Ответы 2

Здесь вы смешиваете ассоциацию has_one :through с ассоциацией has_many :through. Вы можете проверить соответствующую документацию здесь. У вас есть has_one :store и вы пытаетесь создать ассоциацию has_many :products, through: :store, что невозможно.

Либо сделайте это через has_one, например:

has_one :store
has_one :product, through: :store

Или для вашего случая сделайте это has_many: через как:

has_many :stores
has_many :product, through: :stores

Или можно через has_many :products, through: :store снять и сделать has_many :products

Выбор решения зависит от ваших требований.

Ошибка undefined method 'products' for #<User::ActiveRecord_Relation:0x007fbd25e42ac0> при попытке получить продукты из пользовательского объекта. У вас возникла проблема?

Dipak Gupta 21.03.2018 12:28

Ошибка из-за вызова products на ActiveRecord_Relation. Независимо от того, как вы определяете ассоциации, ошибка останется как есть.

Jagdeep Singh 22.03.2018 06:34

Попробуйте заменить:

def index
  @partners = User.partner
  @male = User.find_by(gender: 0)
  @female = User.find_by(gender: 1)
end

с участием

 def index
      @partners = User.partner
      @male = User.where(gender: 0)
      @female = User.where(gender: 1)
    end

Вернул undefined method 'products' for #<User::ActiveRecord_Relation:0x007fbd27f356b0>

Rails_learner 21.03.2018 16:56

Другие вопросы по теме