Ruby on rails Rails-覆盖上的主键有一个
我有以下关联,基本上我想通过userid而不是对象的id进行链接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
但是,以下情况确实发生了:
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