我需要一些帮助来构建一个表,然后在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的所有活动记录。
我希望以上内容清楚,如果没有,请告诉我。想法?思考?建议。
由于
答案 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上的代码发布给全世界看。最后你崩溃陷入困境。第二天,你意识到自己已经犯下了什么,就永远放弃编码并成为一名会计师。
<强>道德强>
不要这样做