我有一个从ActiveRecord继承的对象,但它有一个不在DB中持久化的属性,如:
class Foo < ActiveRecord::Base
attr_accessor :bar
end
Run Code Online (Sandbox Code Playgroud)
我希望能够使用ActiveModel Dirty提供的'bar_changed?'等方法跟踪'bar'的更改.问题是,当我尝试在此对象上实现Dirty时,如文档中所述,我收到错误,因为ActiveRecord和ActiveModel都定义了define_attribute_methods,但是参数数量不同,所以我在尝试时遇到错误调用define_attribute_methods [:bar].
我define_attribute_methods在包括之前尝试了别名ActiveModel::Dirty,但没有运气:我得到一个未定义的方法错误.
关于如何处理这个问题的任何想法?当然我可以手动编写所需的方法,但我想知道是否可以使用Rails模块,通过将ActiveModel功能扩展到ActiveRecord未处理的属性.
如果我尝试执行以下代码:
hassle = rota.hassles.create(:sender => user1, :receiver => user2, :type => "sms")
Run Code Online (Sandbox Code Playgroud)
我听到以下错误:
Failure/Error: hassle = rota.hassles.create(:sender => user1, :receiver => user2, :type => "sms")
ActiveModel::MassAssignmentSecurity::Error:
Can't mass-assign protected attributes: type
Run Code Online (Sandbox Code Playgroud)
我不确定这意味着什么.我已经使:type是必须的,所以如果我删除它,我得到一个SQL错误.
我想通过将共享范围移动到模块中来干掉几个模型,例如:
module CommonScopes
extend ActiveSupport::Concern
module ClassMethods
scope :ordered_for_display, order("#{self.to_s.tableize}.rank asc")
end
end
Run Code Online (Sandbox Code Playgroud)
我还想创建测试模块的共享规范.不幸的是,当我尝试在我的模型中包含共享范围时,我得到:
undefined method `order' for CommonScopes::ClassMethods:Module
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?谢谢!
我有以下型号:
User (id, name, network_id)
Network(id, title)
Run Code Online (Sandbox Code Playgroud)
我需要添加什么样的Rails模型关联才能执行以下操作:
@user.network.title
@network.users
Run Code Online (Sandbox Code Playgroud)
谢谢
我试着关注http://api.rubyonrails.org/classes/ActiveModel/Validator.html,但我应该把它放在哪里
class MyValidator < ActiveModel::Validator
def validate(record)
if some_complex_logic
record.errors[:base] = "This record is invalid"
end
end
private
def some_complex_logic
# ...
end
end
Run Code Online (Sandbox Code Playgroud) 我想知道如何在Rails中正确地进行关联.首先,我创建了一个城市模型和一个组织.现在我希望组织有一个城市...这是通过添加has_many和has_one关联来完成的.之后我跑了rake db:migrate.但不知何故,它不会创建一个字段city或city_id在我的数据库模型中.我自己必须这样做吗?rails现在不应该在数据库中创建外键约束吗?
要查看它是否有效我正在使用rails c并输入Organisation
答案如下:
=> Organisation(id: integer, name: string, description: string, url: string, created_at: datetime, updated_at: datetime)
Run Code Online (Sandbox Code Playgroud)
请原谅我的愚蠢问题......我是Rails的初学者,一切都还是很陌生.
谢谢!
市:
class City < ActiveRecord::Base
has_many :organisations
end
Run Code Online (Sandbox Code Playgroud)
组织:
class Organisation < ActiveRecord::Base
has_one :city
end
Run Code Online (Sandbox Code Playgroud)
创建城市:
class CreateCities < ActiveRecord::Migration
def change
create_table :cities do |t|
t.string :name
t.string :country
t.timestamps
end
end
end
Run Code Online (Sandbox Code Playgroud)
创建组织:
class CreateOrganisations < ActiveRecord::Migration
def change
create_table :organisations do |t|
t.string …Run Code Online (Sandbox Code Playgroud) 我有一个Rails项目,就像在大多数应用程序中一样,我们有许多硬性和快速的验证规则,所有对象在持久化之前必须符合这些规则.当然,ActiveModel的Validations是完美的 - 我们使用Rails默认值和我们自己的手动验证的组合.
但是,我们越来越多地反对用例,我们希望提醒用户注意这样的情况:尽管他们的数据在最严格的意义上是无效的,但是他们应该审查哪些元素,但哪些不应该本身可防止记录持久性发生.几个例子,在我的头顶:
验证模块是我们如何处理验证错误的一个很好的比喻 - 并且有很多匹配器已经可用 - 理想情况下我希望能够重用该基本代码,但同时生成一组warnings项目errors.这将使我们能够以不同的方式突出显示这些案例,而不是暗示可能违反房屋风格等同于更严重,严格执行的规则.
我查看了诸如activemodel-warnings之类的 gem ,但它们通过改变在验证记录时检查哪些匹配器,相应地扩展或缩小errors集合来工作.类似地,我查看:on了验证的内置参数,看看我是否可以手动滚动,但是所有违规都会在错误集合中结束而不是分离出来.
有没有人尝试过类似的东西?我无法想象我是唯一一个想要实现这一目标的人,但我现在正在画一个空白......
Rails 3.0中的默认验证错误消息在哪里?例如,ActiveRecord :: Error.default_error_messages [:take]的等价物是什么?我发现ActiveModel处理错误而不是ActiveRecord,但我自己找不到错误.
我已经将我的database.yml配置为指向我现有的mysql数据库
我怎样才能从中生成模型?
rails generate model existing_table_name
Run Code Online (Sandbox Code Playgroud)
只提供一个emty模型..
随着Rails的一个普通的ActiveRecord/SQL设置在控制台当我执行命令*.where,*.all等我回来的记录项的实际阵列.但是,在切换到Mongoid之后,我改回了一个标准.我如何获得实际结果?
这就是我现在得到的......
ruby-1.9.2-p180 :001 > App.all
=> #<Mongoid::Criteria
selector: {},
options: {},
class: App,
embedded: false>
Run Code Online (Sandbox Code Playgroud)