Rails 4选择全部

时间:2015-11-04 19:17:19

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

如何在Rails中执行此操作

在我看来,如果我选择一个用户,那么我想显示用户所在的所有类别,但问题是这是一个单独的表(Legacy DB)没有关系

我曾尝试做过类似的事情,但它不起作用

where('user in ?', categories)

我得到ActiveRecord_Relation:0x007fb16f90abf0

表格列是这样的

  • 用户类别
  • user1 category1
  • user1 category2
  • user2 category2
  • user2 category4

2 个答案:

答案 0 :(得分:0)

您可以将direct sql query用于数据库。

以下是一个示例,您的查询将取决于您的架构:

result = ActiveRecord::Base.connection.execute("SELECT * FROM categories WHERE user_id = #{@user.id}")
result.to_a

更新

根据评论对话:

假设#1

  1. 传统数据库,单表,无关系,单一模型 - >假设用户
  2. 用户有两个字符串字段:(1)user_full_name(2)category
  3. 在这种情况下,我们可以这样做:

    User.where(:user_full_name => @user.user_full_name).pluck(:category).flat.uniq
    

    否则,

    假设#2

    不知何故,你在这个数据库中没有模型,我们又回到了直接sql。

    sql = "SELECT category FROM TABLE_NAME WHERE user_full_name = #{user_full_name}"
    result = ActiveRecord::Base.connection.execute(sql)
    result.to_a.flat.uniq
    

答案 1 :(得分:0)

  

我想显示用户所在的所有类别

@categories = User.where(id: params[:id]).pluck(:category)

这将返回集合数据,您可以使用.each循环或其他某种recursion循环播放:

@categories.each do |category|
   category #-> since this will be a single value, you don't need any attributes
end

-

ActiveRecord association

#app/models/user.rb
class User < ActiveRecord::Base
   has_and_belongs_to_many :categories
end

#app/models/category.rb
class Category < ActiveRecord::Base
   has_and_belongs_to_many :users
end

这是一种has_and_belongs_to_many关系,通过许多,您可以 <{em> users categories,如下:

@user = User.find params[:id]
@categories = @user.categories

这也将返回集合的数据;不同之处在于,此实例中的categories将根据与Category关联的每个user对象构建。

您可以按以下方式拨打电话:

@user.categories.each do |category|
   category.name
end

要进行此设置,您只需设置连接表categories_users):

$ rails g migration CreateCategoriesUsers

#db/migrate/create_categories_users_____.rb
class CreateCategoriesUsers < ActiveRecord::Migration
   def change
      create_table :categories_users, id: false do |t|
         t.references :user
         t.references :category
      end
   end
end

$ rake db:migrate