0

我在模型之间有一个相当复杂的关系,现在对检索一些对象的 SQL 查询感到沮丧。

给定Product 模型通过 has_many连接到类别模型:通过关联和联合表分类。还有一个用户模型通过 has_many :through 关联和联合表 *category_friendship*连接到此类别模型。

我现在面临检索所有产品的问题,这些产品在数组 user.category_ids 的类别中。但是,我不能仅仅设法正确地编写 WHERE 语句。

我试过这个:

u = User.first
uc = u.category_ids
Product.where("category_id IN (?)", uc)

但是这不起作用,因为它在产品表中没有直接的 category_id。但是我怎样才能改变它来使用联合表分类呢?

我给你的模型细节,也许你会发现它有助于回答我的问题:

产品.rb

class Product < ActiveRecord::Base

 belongs_to :category

 def self.from_users_or_categories_followed_by(user)
 cf = user.category_ids
 uf = user.friend_ids

 where("user_id IN (?)", uf) # Products out of friend_ids (uf) works fine, but how to extend to categories (cf) with an OR clause?
 end

类别.rb

class Category < ActiveRecord::Base
 has_many :categorizations
 has_many :products, through: :categorizations
 has_many :category_friendships
 has_many :users, through: :category_friendships

分类.rb

class Categorization < ActiveRecord::Base

 belongs_to :category
 belongs_to :product

Category_friendship.rb

class CategoryFriendship < ActiveRecord::Base

 belongs_to :user
 belongs_to :category

用户.rb

类用户 < ActiveRecord::Base

has_many :category_friendships
has_many :categories, through: :category_friendships

def feed
 Product.from_users_or_categories_followed_by(self) #this should aggregate the Products
end

如果您需要更多详细信息来回答,请随时询问!

4

2 回答 2

0

查看您定义的关联并简化事情。对我们必须实现的目标进行一些重构。

产品.rb

class Product < ActiveRecord::Base

  belongs_to :category

 end

用户.rb

  class User < ActiveRecord::Base
        has_many :categories, through: :category_friendships
        scope :all_data , includes(:categories => [:products])

   def get_categories
     categories
   end

   def feed
      all_products = Array.new
      get_categories.collect {|category| category.get_products }.uniq
   end
  end

类别.rb

class Category < ActiveRecord::Base
 has_many :users, through: :category_friendships
 has_many :products

 def get_products
   products
 end
end

无需创建 CATEGORY_FRIENDSHIP 模型,只需要一个名为 CATEGORIES_FRIENSHIPS 的连接表,该表只有 USER_ID 和 CATEGORY_ID

用法:已更新

控制器

  class UserController < ApplicationController
         def index
           @all_user_data = User.all_data
        end
   end

查看 index.html.erb

<% for user in @all_user_data %>
 <% for products in user.feed %>
  <% for product in products %>
       <%= product.name %>
     end
  end
end
于 2012-09-04T12:02:11.437 回答
0

我赞成 Ankits 的回答,但我意识到有一种更优雅的方式来处理这个问题:

给定:

u = User.first
uc = u.category_ids

然后我可以使用以下方法从类别中检索产品:

products = Product.joins(:categories).where('category_id IN (?)', uc)
于 2012-09-05T12:23:15.667 回答