我在模型之间有一个非常复杂的关系,现在被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
如果您需要更多详细信息,请随时提出!
答案 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)