构建一个具有User_id字段的表,然后查询特定的User_Id

时间:2011-02-10 00:14:59

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

我需要一些帮助来构建一个表,然后在Rails 3中从该表中获取数据。

以下是细分:

模型 - 这里涉及的3个模型是:

  • 线程有很多参与者
  • 参与者属于线程
  • 用户

活动表:

id | thread_id | participants

示例记录如下所示:

1 | 300 | 3,1,5,67,13
2 | 333 | 3,12
3 | 433 | 1,12
4 | 553 | 1,12, 67

如果参与者是user_ids列表,如果有更好的方法来存储user_ids,请告诉我。我还没有建立这个。

填充活动表后。然后我希望能够查询以下内容: 选择参与者字段中包含67的participant_id的所有活动记录。

我希望以上内容清楚,如果没有,请告诉我。想法?思考?建议。

由于

1 个答案:

答案 0 :(得分:5)

虽然在列中存储多个值很诱人,但最终会有人受伤。你最好建立一个连接表来关联模型。

例如,你可以这样做:

class DiscussionThread < ActiveRecord::Base
  has_many :participations
  has_many :participants, :through => :participations
end

class Participation < ActiveRecord::Base
  belongs_to :discussion_thread
  belongs_to :participant, :class_name => "User", :foreign_key => :user_id
end

class User < ActiveRecord::Base
  has_many :participations
  has_many :dicussion_threads, :through => :participations
end

这给你三张桌子:

table: discussion_threads
columns: id

table: participations
columns: id | discussion_thread_id | user_id

table: users
columns: id

要查找用户参与的主题,请执行以下操作:

@user.discussion_threads

并找到参与线程的用户:

@discussion_thread.participants

注意:Thread是Ruby中的保留字,因此我将其重命名为DiscussionThread

修改

介绍如何序列化一组id然后查询它们的示例?

你在半夜醒来,在一种奇怪的强迫力下,你会去你的电脑并创造这种迁移:

rails g model Abomination horror_ids:text

和型号:

class Abomination < ActiveRecord::Base
  serialize :horror_ids
end

您测试它以确保它可以存储数组:

@abomination = Abomination.create(:horror_ids=>[2,33,42])
@abomination.horror_ids # => [2,33,42]

那又怎样?你知道在幕后Rails将它转换为YAML,看起来像这样:

---\n
- 2\n
- 33\n
- 42\n

再次被强烈的催促迫使你想知道“我怎么能搜索存储在这个专栏中的特定内容?”。嗯,这只是一个字符串,对吧?您知道如何在文本字段中找到它:

cthulhu = 33
Abomination.where(["horror_ids LIKE '%- ?\n%'",cthulhu]).first

随着恐惧感的增加,你会发现有人可能会偶然发现这一点,并认为这实际上是一个好主意。它必须被销毁!但你无法键入rm -rf *,而是奇怪的力量会让你考虑到未来 Cthulhu 开发者的盲目追随者可能需要知道的怪癖,例如

@abomination = Abomination.create
@abomination.horror_ids # => nil

@abomination = Abomination.create(:horror_ids=>[])
@abomination.horror_ids # => []

@abomination = Abomination.create(:horror_ids=>"any string value can go here")
@abomination.horror_ids # => "any string value can go here"

当列大小太小而无法容纳所有序列化数据时,序列化数据可能会被破坏。

你做出了最后的努力来踢出电源线,但为时已晚,控制你的喋喋不休,疯狂的意识将StackOverflow上的代码发布给全世界看。最后你崩溃陷入困境。第二天,你意识到自己已经犯下了什么,就永远放弃编码并成为一名会计师。

<强>道德

不要这样做