当使用:through选项时,显然依赖=> destroy被忽略.
所以我有这个......
class Comment < ActiveRecord::Base
has_many :comment_users, :dependent => :destroy
has_many :users, :through => :comment_users
...
end
Run Code Online (Sandbox Code Playgroud)
...但删除评论不会导致关联的comment_user记录被删除.
那么,当使用时,对于级联删除,推荐的方法是什么:通过?
谢谢
我正在为我的codeigniter网站整理几个模型,似乎无法在文档中找到如何处理使用Active Record系统时可能发生的错误的任何文字.
该文档演示了如何执行CRUD以及一些相对较复杂的查询,但没有讨论错误处理.我做了一个快速谷歌搜索,似乎Active Record类不会抛出异常.是这样的吗?没有尝试赶上......
那么,你如何编码处理codeigniter中的数据库错误?(连接失败,重复密钥,参考完整性损坏,截断,数据类型错误等)
无论如何我可以通过子模型()返回的项目数来订购结果(ASC/ )吗?DESCJobs
@featured_companies = Company.joins(:jobs).group(Job.arel_table[:company_id]).order(Job.arel_table[:company_id].count).limit(10)
Run Code Online (Sandbox Code Playgroud)
例如:我需要打印最高职位的公司
现在,在Rails 4中不推荐使用ActiveRecord :: Relation#all,你应该如何迭代所有记录?
过去像:
Foo.all.each do |foo|
# whatever
end
Run Code Online (Sandbox Code Playgroud)
我现在可以这样近似,但感觉很脏:
Foo.where(true).each do |foo|
# whatever
end
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
问题如下:
结果是:
我想以某种方式告诉rake忽略挂起的迁移,但到目前为止无法做到这一点.
更新(由于额外的经验)
有时迁移和模型代码不同步,因此迁移不会运行.为避免此问题,最近在迁移中使用了重新定义模型:
# reset all callbacks, hooks, etc for this model
class MyAwesomeModel < ActiveRecord::Base
end
class DoSomethingCool < ActiveRecord::Migration
def change
...
end
end
Run Code Online (Sandbox Code Playgroud) 所以我知道如何覆盖ActiveRecord对象的属性的默认getter
def custom_getter
return self[:custom_getter] || some_default_value
end
Run Code Online (Sandbox Code Playgroud)
我试图实现相同的东西,但属于一个属于协会.例如.
class Foo < AR
belongs_to :bar
def bar
return self[:bar] || Bar.last
end
end
class Bar < AR
has_one :foo
end
Run Code Online (Sandbox Code Playgroud)
当我说:
f = Foo.last
Run Code Online (Sandbox Code Playgroud)
我想让方法f.bar返回最后一个Bar,而不是nil,如果该关联还不存在.
但这不起作用.原因是self [:bar]总是未定义的.它实际上是自我[:bar_id].
我可以做一些天真的事情:
def bar
if self[:bar_id]
return Bar.find(self[:bar_id])
else
return Bar.last
end
end
Run Code Online (Sandbox Code Playgroud)
但是,即使已经获取了Bar,这也总是会进行db调用,这当然不是理想的.
有没有人能够了解我如何建立关系,以便belongs_to属性只加载一次,如果没有设置则具有默认值.
我正在使用Rails 3.2并进行包含以下代码的迁移:
add_column :users, :gift_aid, :integer, :default => 2
# reset columns
User.reset_column_information
... code here to load legacy data from sqlite3 database ...
# now create a user with the loaded column data
user = User.create( ...other cols...,
:gift_aid => migrated_gift_aid_column_data,
...other cols... )
Run Code Online (Sandbox Code Playgroud)
我unknown attribute: gift_aid在运行迁移时得到了.User.column_names在调用之前和之后显示相同的列表reset_column_information.
奇怪的是,当我手动删除mysql中的列并重新运行迁移时,它按预期工作.从第一次迁移开始,再次使用空数据库并且它不起作用,因此它与运行所有迁移而不是单个迁移有关.
我之前有几个关于User模型的迁移,包括reset_column_information两者都可以正常工作.
我真的在这个问题上摸不着头脑 - 任何人都有任何想法
我正在构建一个博客应用程序.如果"发布"多个"帖子",我希望能够复制"文章"这个词.
像这样:可用文章或可用文章
这就是我拥有的......
Available <%= pluralize @posts.published, "Article" %>:
Run Code Online (Sandbox Code Playgroud)
我试过了
Available <%= pluralize @posts.published.count, "Article" %>:
Run Code Online (Sandbox Code Playgroud)
这工作......但我不想要这个号码.它不应该读取可用的5篇文章....它应该没有数字.
在测试轨道模型中的getter/setter对时,我发现了一个很好的行为示例,我一直认为它很奇怪且不一致.
在这个例子中,我正在处理class Folder < ActiveRecord::Base.
Folder belongs_to :parent, :class_name => 'Folder'
在getter方法上,如果我使用:
def parent_name
parent.name
end
Run Code Online (Sandbox Code Playgroud)
...要么...
def parent_name
self.parent.name
end
Run Code Online (Sandbox Code Playgroud)
...结果完全一样,我得到了父文件夹的名称.但是,如果我使用getter方法...
def parent_name=(name)
parent = self.class.find_by_name(name)
end
Run Code Online (Sandbox Code Playgroud)
......父母变成零,但如果我用......
def parent_name=(name)
self.parent = self.class.find_by_name(name)
end
Run Code Online (Sandbox Code Playgroud)
......那么它的确有效.
所以,我的问题是,为什么你有时需要声明self.method,为什么你只能使用局部变量?
这似乎需要/使用self的ActiveRecord的不一致,我想明白这一点更好,所以我不觉得我一直在猜测我是否需要自行申报与否.您应该/何时不应该在ActiveRecord模型中使用self?
我正在尝试对序列化列进行简单查询,你是如何做到这一点的?
serialize :mycode, Array
1.9.3p125 :026 > MyModel.find(104).mycode
MyModel Load (0.6ms) SELECT `mymodels`.* FROM `mymodels` WHERE `mymodels`.`id` = 104 LIMIT 1
=> [43565, 43402]
1.9.3p125 :027 > MyModel.find_all_by_mycode("[43402]")
MyModel Load (0.7ms) SELECT `mymodels`.* FROM `mymodels` WHERE `mymodels`.`mycode` = '[43402]'
=> []
1.9.3p125 :028 > MyModel.find_all_by_mycode(43402)
MyModel Load (1.2ms) SELECT `mymodels`.* FROM `mymodels` WHERE `mymodels`.`mycode` = 43402
=> []
1.9.3p125 :029 > MyModel.find_all_by_mycode([43565, 43402])
MyModel Load (1.1ms) SELECT `mymodels`.* FROM `mymodels` WHERE `mymodels`.`mycode` IN (43565, 43402)
=> []
Run Code Online (Sandbox Code Playgroud) activerecord ×10
ruby ×2
associations ×1
codeigniter ×1
migration ×1
php ×1
pluralize ×1
rake ×1
search ×1
self ×1