标签: activerecord

dependent =>在"has_many through"关联上销毁

当使用: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记录被删除.

那么,当使用时,对于级联删除,推荐的方法是什么:通过?

谢谢

activerecord ruby-on-rails has-many-through

48
推荐指数
3
解决办法
4万
查看次数

Codeigniter - 使用活动记录时处理错误

我正在为我的codeigniter网站整理几个模型,似乎无法在文档中找到如何处理使用Active Record系统时可能发生的错误的任何文字.

该文档演示了如何执行CRUD以及一些相对较复杂的查询,但没有讨论错误处理.我做了一个快速谷歌搜索,似乎Active Record类不会抛出异常.是这样的吗?没有尝试赶上......

那么,你如何编码处理codeigniter中的数据库错误?(连接失败,重复密钥,参考完整性损坏,截断,数据类型错误等)

php activerecord codeigniter

48
推荐指数
2
解决办法
4万
查看次数

Rails按has_many关联的结果计数排序

无论如何我可以通过子模型()返回的项目数来订购结果(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)

例如:我需要打印最高职位的公司

activerecord ruby-on-rails ruby-on-rails-3

48
推荐指数
5
解决办法
3万
查看次数

Rails 4:找到所有记录

现在,在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)

有没有更好的办法?

activerecord ruby-on-rails-4

48
推荐指数
3
解决办法
5万
查看次数

Rails 4如何忽略挂起的迁移

问题如下:

  • 我有db/seed.rb充满了初始数据.
  • 迁移之一取决于此种子提供的数据.
  • 我正在尝试从空数据库部署我的应用程序.

结果是:

  • RAILS_ENV =生产rake db:migrate - 由于缺少初始数据而失败
  • RAILS_ENV =生产rake db:seed - 由于挂起的迁移而失败

我想以某种方式告诉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)

ruby activerecord ruby-on-rails

48
推荐指数
3
解决办法
2万
查看次数

rails覆盖关系的默认getter(belongs_to)

所以我知道如何覆盖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属性只加载一次,如果没有设置则具有默认值.

activerecord ruby-on-rails associations default-value

47
推荐指数
3
解决办法
2万
查看次数

Model.reset_column_information不会在rails迁移中重新加载列

我正在使用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两者都可以正常工作.

我真的在这个问题上摸不着头脑 - 任何人都有任何想法

migration rake activerecord ruby-on-rails ruby-on-rails-3.2

47
推荐指数
1
解决办法
2万
查看次数

在轨道4中没有计数的复数

我正在构建一个博客应用程序.如果"发布"多个"帖子",我希望能够复制"文章"这个词.

像这样:可用文章或可用文章

这就是我拥有的......

 Available <%=  pluralize @posts.published, "Article" %>:
Run Code Online (Sandbox Code Playgroud)

我试过了

 Available <%=  pluralize @posts.published.count, "Article" %>:
Run Code Online (Sandbox Code Playgroud)

这工作......但我不想要这个号码.它不应该读取可用的5篇文章....它应该没有数字.

activerecord ruby-on-rails pluralize ruby-on-rails-4

47
推荐指数
2
解决办法
1万
查看次数

为什么在ruby/rails/activerecord中总是不需要self?

在测试轨道模型中的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?

ruby activerecord self ruby-on-rails-3

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

使用活动记录搜索序列化数据

我正在尝试对序列化列进行简单查询,你是如何做到这一点的?

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)

search serialization activerecord ruby-on-rails

46
推荐指数
6
解决办法
3万
查看次数