用于Has_Many / Belongs_To关系的Rails未定义方法

时间:2017-01-13 00:17:22

标签: ruby-on-rails

我有一个应用,管理员必须在购买产品之前为每位用户创建自定义价格。一个pricing belongs_to一个user和一个product,一个user has_many pricings和一个product { {1}} has_many。路线是这样的:

pricings

devise_for :users, :controllers => { registrations: 'registrations' } resources :users, only: [:show] resources :products do resources :pricings end 页面上,我正在尝试获取该用户的users#show列表。我的pricings

中有以下内容
users_controller

这是我的def show @user = User.find(params[:id]) @products_with_pricing = Product.joins(:pricings).group("products.id").having("count(products.id) > ?",0) end 观点:

users#show

如果我省略<% @products_with_pricing.each do |product| %> <% if product.pricing.user == current_user %> <%= product.name %> <% end %> <% end %> 语句,则显示所有pricings的所有产品名称,但是使用该语句,我在if语句行中收到if ....== current_user错误,该错误表示:

  

未定义的方法&#39;定价&#39;因为#你呢?   意思? pricings`

有人能否直截了当地确定实现这一目标的最佳途径?

1 个答案:

答案 0 :(得分:2)

产品 has_many pricings

这意味着要获得产品的价格,您需要致电product.pricings,这将返回一组价格。您看到的错误是正确的,产品没有返回一个定价对象的pricing方法,它有pricings方法返回许多定价。

如果您的目标是仅获取其定价也属于该用户的产品,我建议您调整SQL查询以实现此目的

Product.joins(pricings: :users)
.where(pricings: { user: { id: current_user.id } })
.group("products.id")
.having("count(products.id) > ?",0)

注意:您可能需要在where和join

中混淆多个pricings和users

这个查询引入了一个新的连接和一个where子句,它将过滤那些pricings的用户id为当前用户的产品,因此你根本不需要if语句