- 浏览: 2075956 次
- 性别:
- 来自: NYC
文章分类
- 全部博客 (628)
- Linux (53)
- RubyOnRails (294)
- HTML (8)
- 手册指南 (5)
- Mysql (14)
- PHP (3)
- Rails 汇总 (13)
- 读书 (22)
- plugin 插件介绍与应用 (12)
- Flex (2)
- Ruby技巧 (7)
- Gem包介绍 (1)
- javascript Jquery ext prototype (21)
- IT生活 (6)
- 小工具 (4)
- PHP 部署 drupal (1)
- javascript Jquery sort plugin 插件 (2)
- iphone siri ios (1)
- Ruby On Rails (106)
- 编程概念 (1)
- Unit Test (4)
- Ruby 1.9 (24)
- rake (1)
- Postgresql (6)
- ruby (5)
- respond_to? (1)
- method_missing (1)
- git (8)
- Rspec (1)
- ios (1)
- jquery (1)
- Sinatra (1)
最新评论
-
dadadada2x:
user模型里加上 protected def email ...
流行的权限管理 gem devise的定制 -
Sev7en_jun:
shrekting 写道var pattern = /^(0| ...
强悍的ip格式 正则表达式验证 -
jiasanshou:
好文章!!!
RPM包rpmbuild SPEC文件深度说明 -
寻得乐中乐:
link_to其实就是个a标签,使用css控制,添加一个参数: ...
Rails在link_to中加参数 -
aiafei0001:
完全看不懂,不知所然.能表达清楚一点?
"$ is not defined" 的问题怎么办
使用的是rails2.0.2版本,。现有表结构如下:
在model中写法是:
在执行@user.roles << role 报错Cannot associate new records through 'User#user_roles' on '#'. Both records must have an id in order to create the has_many :through record associating them.
我很奇怪关联中“#”是哪里出来的?没弄明白。foreign_key这个配置选项我都已经尝试过好几次变化了,都没成功。。。不知道原因在那里?还是对于这样自定义的表进行关联式有问题的?
正常来说
按照你所需要的建多对多关联表 是这样弄的
就生成对应的表和字段了
然后是model
over
你的错误应该是指定了错误的外键 导致的..
对于belongs_to :foreign_key是默认的,除非你的,主键不是id,如果你只是修改了table没有改field名的话,考虑去掉:foreign_key。
参考官方API
那么,楼主的问题在哪呢?
楼主最主要不一样的地方是,打破了一个默认规则,就是不希望,物理表名和Model名一致。
实际,对于这样的需要只需要set_table就够了,也就是model写成这样
那么,最开始说了,什么时候用指定:foreign_key
接着看看,什么时候用:class_name,这个应该是,只有定义的关系和类名不一致的时候。例如:假设楼主,很坚持使用user_roles,就可以按下面写
Ruby代码
换句话说,这里没有问题,没有不一致的问题。
只是,不应该指定一个,不太合逻辑的foreign_key。也就是说belongs_to的class_name和forein_key可以不去掉,顶多就是重复写了一遍。has_many的foreign_key也可以去掉,因为和默认的外键是一样的,毕竟你的id还是主键。
那么,如果楼主说了,我就偏要写呢,
嗯,也可以,那就像楼上说的,那得把foreign_key写对。
has_many的默认foreign_key是什么呢,那就要看看逻辑啦
你有很多子表,那么外键就是你的主键了,所以应该是,主表名加主id。
或者,也可以参考,官方API
也就是说,楼主的Model写成下面的,也没问题。
最后,说说,为什么:foreign_key写成id的问题,@user.roles能找到,但添加会有问题呢?
因为,:foreign_key写成id,@user.roles就变成
DrUserRole.find_by_id(@user.id)
而不是,正确的
DrUserRole.find_by_user_id(@user.id)
create table mc$dr_role( id number primary key, role varchar2(30), enabled varchar2(10) ) create table mc$dr_user_roles( id number primary key, user_id number , role_id number ) create table users( id number primary key, name varchar2(30) , passwd varchar2(30) )
在model中写法是:
class Role < ActiveRecord::Base set_table_name "mc$dr_role" has_many :user_roles, :class_name =>"DrUserRole", :foreign_key=>"id", :dependent=> :delete_all has_many :users, :through => :user_roles end class User < ActiveRecord::Base has_many :user_roles, :class_name =>"DrUserRole", :foreign_key=>"id", :dependent=> :destroy has_many :roles, :through => :user_roles end class DrUserRole < ActiveRecord::Base set_table_name "mc$dr_user_roles" belongs_to :user, :class_name =>"User", :foreign_key=>"user_id" belongs_to :role, :class_name =>"Role", :foreign_key=>"role_id" end
在执行@user.roles << role 报错Cannot associate new records through 'User#user_roles' on '#'. Both records must have an id in order to create the has_many :through record associating them.
我很奇怪关联中“#”是哪里出来的?没弄明白。foreign_key这个配置选项我都已经尝试过好几次变化了,都没成功。。。不知道原因在那里?还是对于这样自定义的表进行关联式有问题的?
正常来说
按照你所需要的建多对多关联表 是这样弄的
ruby generate model role role:string enable:string ruby generate model user name:string pass:string ruby generate model UserRole user_id:integer role_id:integer rake db:migrate
就生成对应的表和字段了
然后是model
class Role < ActiveRecord::Base has_many :user_roles,:dependent=> :destroy has_many :users, :through => :user_roles end class User < ActiveRecord::Base has_many :user_roles,:dependent=> :destroy has_many :roles, :through => :user_roles end class DrUserRole < ActiveRecord::Base belongs_to :user belongs_to :role end
over
你的错误应该是指定了错误的外键 导致的..
对于belongs_to :foreign_key是默认的,除非你的,主键不是id,如果你只是修改了table没有改field名的话,考虑去掉:foreign_key。
参考官方API
引用
:foreign_key
Specify the foreign key used for the association. By default this is guessed to be the name of the association with an "_id" suffix. So a class that defines a belongs_to :person association will use "person_id" as the default :foreign_key. Similarly, belongs_to :favorite_person, :class_name => "Person" will use a foreign key of "favorite_person_id".
Specify the foreign key used for the association. By default this is guessed to be the name of the association with an "_id" suffix. So a class that defines a belongs_to :person association will use "person_id" as the default :foreign_key. Similarly, belongs_to :favorite_person, :class_name => "Person" will use a foreign key of "favorite_person_id".
那么,楼主的问题在哪呢?
楼主最主要不一样的地方是,打破了一个默认规则,就是不希望,物理表名和Model名一致。
实际,对于这样的需要只需要set_table就够了,也就是model写成这样
class Role < ActiveRecord::Base set_table_name "mc$dr_role" has_many :dr_user_roles, :dependent=> :delete_all has_many :users, :through => :dr_user_roles end class User < ActiveRecord::Base has_many :dr_user_roles, :dependent=> :destroy has_many :roles, :through => :dr_user_roles end class DrUserRole < ActiveRecord::Base set_table_name "mc$dr_user_roles" belongs_to :user belongs_to :role end
那么,最开始说了,什么时候用指定:foreign_key
接着看看,什么时候用:class_name,这个应该是,只有定义的关系和类名不一致的时候。例如:假设楼主,很坚持使用user_roles,就可以按下面写
Ruby代码
class Role < ActiveRecord::Base set_table_name "mc$dr_role" has_many :user_roles, :class_name =>"DrUserRole", :dependent=> :delete_all has_many :users, :through => :user_roles end class User < ActiveRecord::Base has_many :user_roles, :class_name =>"DrUserRole", :dependent=> :destroy has_many :roles, :through => :user_roles end class DrUserRole < ActiveRecord::Base set_table_name "mc$dr_user_roles" belongs_to :user belongs_to :role end
换句话说,这里没有问题,没有不一致的问题。
只是,不应该指定一个,不太合逻辑的foreign_key。也就是说belongs_to的class_name和forein_key可以不去掉,顶多就是重复写了一遍。has_many的foreign_key也可以去掉,因为和默认的外键是一样的,毕竟你的id还是主键。
那么,如果楼主说了,我就偏要写呢,
嗯,也可以,那就像楼上说的,那得把foreign_key写对。
has_many的默认foreign_key是什么呢,那就要看看逻辑啦
你有很多子表,那么外键就是你的主键了,所以应该是,主表名加主id。
或者,也可以参考,官方API
:foreign_key # Specify the foreign key used for the association. By default this is guessed to be the name of this class in lower-case and "_id" suffixed. So a Person class that makes a has_many association will use "person_id" as the default :foreign_key.
也就是说,楼主的Model写成下面的,也没问题。
class Role < ActiveRecord::Base set_table_name "mc$dr_role" has_many :user_roles, :class_name =>"DrUserRole", :foreign_key=>"role_id", :dependent=> :delete_all has_many :users, :through => :user_roles end class User < ActiveRecord::Base has_many :user_roles, :class_name =>"DrUserRole", :foreign_key=>"user_id", :dependent=> :destroy has_many :roles, :through => :user_roles end class DrUserRole < ActiveRecord::Base set_table_name "mc$dr_user_roles" belongs_to :user, :class_name =>"User", :foreign_key=>"user_id" belongs_to :role, :class_name =>"Role", :foreign_key=>"role_id" end
最后,说说,为什么:foreign_key写成id的问题,@user.roles能找到,但添加会有问题呢?
因为,:foreign_key写成id,@user.roles就变成
DrUserRole.find_by_id(@user.id)
而不是,正确的
DrUserRole.find_by_user_id(@user.id)
发表评论
-
Destroying a Postgres DB on Heroku
2013-04-24 10:58 935heroku pg:reset DATABASE -
VIM ctags setup ack
2012-04-17 22:13 3259reference ctags --extra=+f --e ... -
alias_method_chain方法在3.1以后的替代使用方式
2012-02-04 02:14 3295alias_method_chain() 是rails里的一个 ... -
一些快速解决的问题
2012-01-19 12:35 1472问题如下: 引用Could not open library ... -
API service 安全问题
2011-12-04 08:47 1386这是一个长期关注的课题 rest api Service的 ... -
Module方法调用好不好
2011-11-20 01:58 1349以前说,用module给class加singleton方法,和 ... -
一个ajax和rails交互的例子
2011-11-19 01:53 1908首先,这里用了一个,query信息解析的包,如下 https: ... -
Rails 返回hash给javascript
2011-11-19 01:43 2277这是一个特别的,不太正统的需求, 因为,大部分时候,ajax的 ... -
关于Rubymine
2011-11-18 23:21 2267开个帖子收集有关使用上的问题 前一段时间,看到半价就买了。想 ... -
ruby中和javascript中,动态方法的创建
2011-11-18 21:01 1241class Klass def hello(*args) ... -
textmate快捷键 汇总
2011-11-16 07:20 8147TextMate 列编辑模式 按住 Alt 键,用鼠标选择要 ... -
Ruby面试系列六,面试继续面试
2011-11-15 05:55 2025刚才受到打击了,充分报漏了自己基础不扎实,不肯向虎炮等兄弟学习 ... -
说说sharding
2011-11-13 00:53 1492这个东西一面试就有人 ... -
rails面试碎碎念
2011-11-12 23:51 1946面试继续面试 又有问ru ... -
最通常的git push reject 和non-fast forward是因为
2011-11-12 23:29 17216git push To git@github.com:use ... -
Rails 自身的many to many关系 self has_many
2011-11-12 01:43 2738简单点的 #注意外键在person上people: id ... -
Rails 3下的 in place editor edit in place
2011-11-12 01:20 946第一个版本 http://code.google.com/p ... -
Heroku 的诡异问题集合
2011-11-11 07:22 1697开个Post记录,在用heroku过程中的一些诡异问题和要注意 ... -
SCSS 和 SASS 和 HAML 和CoffeeScript
2011-11-07 07:52 12960Asset Pipeline 提供了内建 ... -
Invalid gemspec because of the date format in specification
2011-11-07 02:14 2122又是这个date format的错误。 上次出错忘了,记录下 ...
相关推荐
rails_apps_composer, 一个 gem,为 Rails 启动应用程序创建 Rails 应用程序模板 Rails 应用编辑器 Rails 应用程序编辑器 gem 安装一个 命令行 工具来从"食谱"的..."你可以使用 rails_apps_composer gem 执行以下操作:
rails_semantic_logger, Rails 语义记录器用语义记录器替换 Rails 缺省记录器 Rails 语义记录器 语义记录器用语义记录器替代 Rails 缺省记录器。http://github.com/rocketjob/rails_semantic_logger文档有关完整文档...
"inspinia admin - v2.5 Rails_Full_Version" 是一个基于Rails框架构建的后台管理系统的完整版本。这个系统采用流行的Inspinia Admin模板,提供了丰富的功能和自定义选项,旨在帮助开发者快速构建高效、现代且用户...
在Rails_Full_Version压缩包中,包含了完整的源代码和必要的资源文件,开发者可以通过解压并导入到Rails项目中,按照官方文档进行配置和定制。同时,这个版本可能还包含了升级记录、更改日志和可能的bug修复,以保证...
书中强调了版本控制的重要性,特别是在使用Rails这样的活跃开源项目时。由于Rails不断更新,新功能的引入或API的修改都可能导致代码兼容性问题。为了确保代码的正确运行,作者建议在使用本书示例代码之前,先检查...
rails_best_practices rails_best_practices是用于检查Rails代码质量的代码度量工具。 它支持以下ORM / ODM: 活动记录 蒙古型 mongomapper 以及以下模板引擎: erb 哈姆 减肥 拉布尔 rails_best_practices...
本资料“RestFul_Rails_Dev_pdf_v_0.1.zip”包含了《RESTful Rails Development》的翻译版,将深入探讨如何在Rails中实现RESTful的设计模式。 首先,RESTful设计的核心概念是资源(Resources)。在Rails中,资源...
本文将详细探讨其在Rails框架下的种子项目(Rails_Seed_Project),旨在帮助开发者更好地理解和运用这一强大的工具。 首先,我们来了解一下“Inspinia Admin”。这是一款基于Bootstrap 3构建的响应式后台模板,提供...
InspiniaAdmin 2.5 Rails_Seed_Project是一款基于Bootstrap框架的高级管理模板,专为Ruby on Rails开发者设计,旨在加速Web应用程序的开发过程。这个项目作为种子启动器,提供了完整的后台管理界面,包括丰富的UI...
Rails_3_Cheat_Sheets.pdf
这是关于如何使用has_many :throght创建多对多关联的完整示例has_many :throght在此示例中,我使用staff模型和client模型,其中人员有很多客户,而客户有很多员工 操作说明 在下面的终端中输入 $ rails new many - ...
自述文件 该自述文件通常会记录启动和运行应用程序所需的所有步骤。 您可能要讲的内容: Ruby版本 系统依赖 配置 数据库创建 数据库初始化 如何运行测试套件 服务(作业队列,缓存服务器,搜索引擎等) ...
介绍插件,用于对记录进行排序(使用 gem)安装要启用rails_admin_acts_as_list,请将以下内容添加到您的Gemfile : gem 'rails_admin_acts_as_list'gem 'rails_admin' 重要提示: rails_admin_acts_as_list之前必须...
InspiniaAdmin 2.5 Rails_full_version
3. **数据缓存**:使用低级缓存`Rails.cache`存储查询结果,避免重复计算。 三、代码优化 1. **避免在循环中进行数据库查询**:将查询移到循环之外,减少不必要的数据库交互。 2. **减少视图复杂性**:保持视图...
该模板包含的文件列表“inspinia_admin_v2.5_Rails_Full_Version”很可能包括以下组成部分: 1. **静态资源**:CSS样式文件、JavaScript脚本和图像资源。这些文件用于构建用户界面,包括响应式布局、图表、表单元素...
rails_email_preview, 在 Rails 中,预览和编辑应用程序邮件程序模板 Rails 电子邮件预览 使用这里 Rails 引擎在浏览器中预览电子邮件。 兼容 Rails 4.2 。电子邮件审阅: 所有电子邮件预览的列表: 代表有两个主题...
gem 'rails_admin_content_builder' 运行生成器并进行迁移 rails g rails_admin_content_builder rake db:migrate 在app / assets / application.scss中添加样式 * = require rails_admin_content_builder 用法 ...