如何在Ruby on Rails中加入2个以上的表?

时间:2016-05-20 11:26:52

标签: mysql ruby-on-rails ruby activerecord

我有4个表usersuser_detailscategoriesgalleries我想在一个查询中显示所有记录。请参阅下面的表格结构

类别

id
name

用户

id
username
email
password
user_type
is_active (0 or 1)
created_at
modified_at

user_details

id
user_id
category_id
name
gender
address
phone

画廊

id
user_id
name
image
is_active

我想获取user_details和category的用户id = 1的所有用户信息,并显示她/她来自galleries表的所有is_active = 1图像

这是我的代码 -

@user_details = User.eager_load(:Category,:Gallery,:UserDetail).where('users.id'=>20, 'users.is_active'=>1, 'users.user_type'=>2, 'galleries.is_active'=>1).first()

我收到错误消息:

Association named 'Category' was not found on User; perhaps you misspelled it?

实际上,我已在Category模型中关联了UserDetails。所以我无法获得Category数据。请看我的所有型号 -

category.rb

class Category < ActiveRecord::Base
  has_many :UserDetail
end

user.rb

class User < ActiveRecord::Base
  #before_save :encrypt_password
  has_one :UserDetail, dependent: :destroy
  has_many :Gallery, dependent: :destroy
end

user_detail.rb

class UserDetail < ActiveRecord::Base
  belongs_to :User
  belongs_to :Category
end

gallery.rb

class Gallery < ActiveRecord::Base
  belongs_to :User
end

让我知道为什么categories表没有加入。请帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

以下是一些事情。匆忙所以无法验证语法,但应该让你非常接近

  1. 正确的关联命名 - 按惯例的关联应该是模型的单数或复数小写snake_case。所以画廊应该是

    班级画廊   belongs_to:user

    类用户   has_many:画廊

  2. 使用include加载值并阻止n + 1个查询

    User.includes(:categories,:user_detail ,,:user_detail)

  3. 使用范围作为条件 @user_details = User.eager_load(:Category,:Gallery,:UserDetail).where(&#39; users.id&#39; =&gt; 20,&#39; users.is_active&#39; =&gt; 1,& #39; users.user_type&#39; =&gt; 2,&#39; galleries.is_active&#39; =&gt; 1).first()

    类用户   范围:有效, - &gt; {where(is_active:1)}   class:of_type, - &gt; (id){where(user_type:id)} 端

  4. 然后更像是

    User.active.of_type(2).includes(:categories, :user_detail, ,:user_detail, :galleries).where('galleries.is_active'=>1).first()