Я пытаюсь написать запрос к базе данных и ломаю голову над тем, что делаю неправильно.
Вот соответствующая модель
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.store.products? @MarekLipka
Возможно, я не совсем понимаю рельсы, но похоже, что menswear - это метод экземпляра User. Но вы используете его как метод класса. Я не уверен, как вам вообще удалось вызвать products на @male
Вы можете показать мне схему базы данных или файл миграции.
@Thananjaya Какой именно файл миграции?
Мол, будет файл 20180301_create_user.rb и 20180301_create_products.rb. Эти файлы известны как файлы миграции, которые можно найти в db/migrate/migration_file. Пожалуйста, опубликуйте.
Обновлено @Thananjaya





Здесь вы смешиваете ассоциацию 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> при попытке получить продукты из пользовательского объекта. У вас возникла проблема?
Ошибка из-за вызова products на ActiveRecord_Relation. Независимо от того, как вы определяете ассоциации, ошибка останется как есть.
Попробуйте заменить:
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>
Вы пытаетесь вызвать метод экземпляра
User#productsв отношении User.