Ruby on rails Rails-覆盖上的主键有一个

Ruby on rails Rails-覆盖上的主键有一个,ruby-on-rails,Ruby On Rails,我有以下关联,基本上我想通过userid而不是对象的id进行链接 但是,以下情况确实发生了: it "should return the correct avatar after being saved" do t = Tweet.new(:twitter_id => 1, :status => 'Tester', :userid => 'personA', :user_pro

我有以下关联,基本上我想通过userid而不是对象的id进行链接


但是,以下情况确实发生了:

it "should return the correct avatar after being saved" do t = Tweet.new(:twitter_id => 1, :status => 'Tester', :userid => 'personA', :user_profile => UserProfile.new(:twitter_userid => 'personA', :avatar => 'abc')) t.save! t.user_profile.avatar.should == 'abc' end 它“保存后应该返回正确的化身”吗 t=Tweet.new(:twitter\u id=>1, :status=>“Tester”, :userid=>“personA”, :user\u profile=>UserProfile.new(:twitter\u userid=>personA',:avatar=>abc')) t、 救命! t、 用户_profile.avatar.should==“abc” 结束 如何强制它使用userid而不是id

谢谢


Ben

如果数据库上的主键不是id,则需要执行以下操作:

class Tweet < AR:B
  set_primary_key "userid" 
end 
class Tweet
然而,我不确定我是否完全理解这个问题。您想跳出rails惯例有什么原因吗?

cite@antiope:/tmp/foo$脚本/控制台
cite@antiope:/tmp/foo$ script/console
Loading development environment (Rails 2.3.4)
>> t = Tweet.new(:twitter_id => 1,
?>                   :status => 'Tester', 
?>                   :userid => 'personA',
?>                   :user_profile => UserProfile.new(:twitter_userid => 'personA', :avatar => 'abc'))
=> #<Tweet id: nil, twitter_id: 1, status: "Tester", userid: "personA", created_at: nil, updated_at: nil>
>> Tweet.set_primary_key :userid
=> nil
>> t.save
  Tweet Create (0.4ms)   INSERT INTO "tweets" ("created_at", "updated_at", "userid", "twitter_id", "status") VALUES('2009-09-10 20:19:36', '2009-09-10 20:19:36', 'personA', 1, 'Tester')
  UserProfile Create (0.1ms)   INSERT INTO "user_profiles" ("twitter_userid", "created_at", "updated_at", "avatar") VALUES('personA', '2009-09-10 20:19:36', '2009-09-10 20:19:36', 'abc')
=> true
>> Tweet.set_primary_key :id
=> nil
加载开发环境(Rails 2.3.4) >>t=Tweet.new(:twitter\u id=>1, ?>:状态=>“测试仪”, ?>:userid=>“personA”, ?>:user\u profile=>UserProfile.new(:twitter\u userid=>'personA',:avatar=>'abc')) => # >>Tweet.set_主键:userid =>零 >>保存 Tweet Create(0.4ms)插入“tweets”(“created_at”,“updated_at”,“userid”,“twitter_id”,“status”)值('2009-09-10 20:19:36','2009-09-10 20:19:36','personA',1','Tester')) 用户配置文件创建(0.1ms)插入“用户配置文件”(“推特用户ID”、“创建时间”、“更新时间”、“化身”)值(“人物”、“2009-09-10 20:19:36”、“2009-09-10 20:19:36”、“abc”) =>正确 >>Tweet.set_主键:id =>零

如果只需在一个位置重新定义主键(我没有测试修改
Tweet
类是否仅影响当前控制器或所有操作),那么在保存模型前一秒钟修改模型可能是一个可接受的解决方案。不过,这只是我认为是一种解决办法。

< P>我认为这可能是最实际的方法。我认为在Rails中是不可能的,否则:
这里发生了两件事。我认为您已将:has_one和:bellings_切换到声明

:属于_to
的型号带有外键。
:has\u one
在所引用的模型中出现(如果它只有一行,否则如果许多行:属于同一行,则它当然是has\u many)。欲了解更多信息,请阅读

首先,您需要指定(否决)模型的主键。这里我假设一个用户可以有很多tweet,而不是一条(否则替换为
:has_one

然后你需要调整你的
:有一个
声明:

class Tweet
  belongs_to :user_profile, :foreign_key => :userid
end
其次,一旦关系设置正确,就不需要在创建时同时分配
:user\u profile
:userid
。您可以创建一个新的
用户配置文件
,外键将自动按正确的顺序进行设置,或者为现有配置文件分配一个
用户ID


希望这能有所帮助。

谢谢,但我的ID是ID。然而,对于这个关联,我想在你的数据库中使用另一个列“personA”?这会过去,所以是的:它“应该保存”do t=Tweet.new(:twitter\u id=>1,:status=>'Tester',:userid=>personA',:user\u profile=>UserProfile.new(:twitter\u userid=>personA',:avatar=>abc'))t.save!t.userid.should=='personA't.new_record?.should==false t.valid?.should==true t.user_profile.new_record?.should==false t.user_profile.valid?.should==true end是否需要将userid用作外键?为什么不只使用关联字段的主键。 it "should return the correct avatar after being saved" do t = Tweet.new(:twitter_id => 1, :status => 'Tester', :userid => 'personA', :user_profile => UserProfile.new(:twitter_userid => 'personA', :avatar => 'abc')) t.save! t.user_profile.avatar.should == 'abc' end
class Tweet < AR:B
  set_primary_key "userid" 
end 
cite@antiope:/tmp/foo$ script/console
Loading development environment (Rails 2.3.4)
>> t = Tweet.new(:twitter_id => 1,
?>                   :status => 'Tester', 
?>                   :userid => 'personA',
?>                   :user_profile => UserProfile.new(:twitter_userid => 'personA', :avatar => 'abc'))
=> #<Tweet id: nil, twitter_id: 1, status: "Tester", userid: "personA", created_at: nil, updated_at: nil>
>> Tweet.set_primary_key :userid
=> nil
>> t.save
  Tweet Create (0.4ms)   INSERT INTO "tweets" ("created_at", "updated_at", "userid", "twitter_id", "status") VALUES('2009-09-10 20:19:36', '2009-09-10 20:19:36', 'personA', 1, 'Tester')
  UserProfile Create (0.1ms)   INSERT INTO "user_profiles" ("twitter_userid", "created_at", "updated_at", "avatar") VALUES('personA', '2009-09-10 20:19:36', '2009-09-10 20:19:36', 'abc')
=> true
>> Tweet.set_primary_key :id
=> nil
class UserProfile
  set_primary_key :userid
  has_many :tweets 
end
class Tweet
  belongs_to :user_profile, :foreign_key => :userid
end