数据库查询 - Rails

时间:2018-03-21 09:54:31

标签: ruby-on-rails postgresql

我正在尝试编写数据库查询,而且我一直在摸不着自己的错误。

这是相关模型

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

它可以工作,但只返回男性和女性的第一个实例。我需要它来返回它的全部

2 个答案:

答案 0 :(得分:0)

您正在将has_one :through关联与has_many :through关联混合在一起。您可以查看正确的文档here。您正在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

选择解决方案符合您的要求。

答案 1 :(得分:0)

尝试更换:

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