Rails:查询2个连接表关联

时间:2012-09-04 10:51:40

标签: ruby-on-rails ruby-on-rails-3 activerecord

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

通过has_many:通过关联和联合表分类,将产品型号连接到类别模型。 此外,用户模型通过has_many:通过关联和联合表* category_friendship *连接到此类别模型

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

我试过了:

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

但是这不起作用,因为它在产品表中没有直接的category_id。但是,如何更改此选项以使用联合表分类?

我正在给你模型细节,也许你觉得回答我的问题很有帮助:

Product.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

Category.rb

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

Categorization.rb

class Categorization < ActiveRecord::Base

 belongs_to :category
 belongs_to :product

Category_friendship.rb

class CategoryFriendship < ActiveRecord::Base

 belongs_to :user
 belongs_to :category

User.rb

class User&lt;的ActiveRecord ::基

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

如果您需要更多详细信息,请随时提出!

2 个答案:

答案 0 :(得分:0)

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

<强> Product.rb

class Product < ActiveRecord::Base

  belongs_to :category

 end

<强> User.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

<强> Category.rb

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

 def get_products
   products
 end
end

不需要创建CATEGORY_FRIENDSHIP模型只需要一个联接表,其中包含必须具有USER_ID和CATEGORY_ID的名称CATEGORIES_FIDENSHIPS

使用:已更新

控制器

  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

答案 1 :(得分:0)

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

下式给出:

u = User.first
uc = u.category_ids

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

products = Product.joins(:categories).where('category_id IN (?)', uc)