小编Der*_*mer的帖子

Rails中的外键问题

我花了一些时间来追查这个错误,但我终于找到了原因.我正在使用Rails框架为纸牌游戏建模.目前我的数据库(大多数)看起来像这样:

cards     cards_games     games      
-----     -----------     -----
id        id              id
c_type    card_id         ...
value     game_id         other_stuff
Run Code Online (Sandbox Code Playgroud)

Rails ActiveRecord card.rb和game.rb目前看起来像这样

#card.rb
class Card < ActiveRecord::Base
  has_and_belongs_to_many :player
  has_and_belongs_to_many :game
  has_and_belongs_to_many :cardsInPlay, :class_name => "Rule"
end
Run Code Online (Sandbox Code Playgroud)
#game.rb
class Game < ActiveRecord::Base
  has_and_belongs_to_many :cards
  has_many :players
  has_one :rules, :class_name => Rule
end
Run Code Online (Sandbox Code Playgroud)

当我尝试运行游戏并且有多个游戏(超过1个)时,我收到错误

ActiveRecord::StatementInvalid in GameController#start_game
# example
Mysql::Error: Duplicate entry '31' for key 1: INSERT INTO `cards_games` (`card_id`, `id`, `game_id`) VALUES (31, 31, 7)
Run Code Online (Sandbox Code Playgroud)

每次动作失败时,cardid == id.我认为,这与Rails如何将数据插入数据库有关.由于没有cardgames对象,我认为它只是将card_id拉入id并将其插入数据库.这可以正常工作,直到你有两张同一张牌的游戏,这违反了卡片游戏的主键约束.由于数据库比较丰富,我对此问题的第一个解决方案是尝试强制rails通过删除id并将cardid和gameid作为主键来遵循这种关系的"真实"定义.它没有用,因为迁移似乎无法处理两个主键(尽管Rails API说它可以做到这一点......很奇怪).另一个解决方案是省略INSERT INTO语句中的'id'列,让数据库处理自动增量.不幸的是,我也不知道该怎么做.

那么,还有另一种解决办法吗?是否有一些我不知道的漂亮的Rails技巧?或者这种结构在Rails中是不可能的?这真是令人沮丧,因为我 …

ruby ruby-on-rails foreign-keys

3
推荐指数
1
解决办法
4849
查看次数

提高C#代码的性能

如何改善以下情况的表现?

我有一个应用程序,可以通过网络接受多个连接.应用程序是用C#编写的,并接受Socket连接.每五分钟,应用程序需要执行一个函数调用来更新应用程序并将信息报告回套接字.截断的代码如下

...
{
    new Thread(Loop).Start();
}

public Loop()
{
    ...
    while (true)
    {
        ...
        string line = user.Read();
        ...
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

上面的代码是Socket连接到服务器时运行的代码.以下代码是每五分钟运行一次的代码.

...
{
    new Thread(TryTick).Start();
}

public void TryTick()
{
    while(true)
    {
        Tick();
        Thread.Sleep(new TimeSpan(0, 5, 0));
    }
}
Run Code Online (Sandbox Code Playgroud)

Tick()执行一些文件I/O操作以及解析非常有限(小于1MB)的XML数据集.但是,这段代码对我的处理器的影响超出了我的想象.一旦发生嘀嗒声,系统似乎抓住了我的双核开发机器的整个Core并且不放手.这似乎是相当简单的事情,但也许我正在以简单的方式而不是快速的方式.

该系统旨在处理多达100个用户,更多数据,并且在加载期间响应时间小于1秒,因此性能是一个问题.

c# performance multithreading

1
推荐指数
1
解决办法
2619
查看次数