假设我是猴子修补类中的方法,我怎么能从覆盖方法调用重写方法?就像有点像super
例如
class Foo
def bar()
"Hello"
end
end
class Foo
def bar()
super() + " World"
end
end
>> Foo.new.bar == "Hello World"
Run Code Online (Sandbox Code Playgroud) 使用accepts_nested_attributes_for时如何编辑连接模型的属性?
我有3个模型:由连接器加入的主题和文章
class Topic < ActiveRecord::Base
has_many :linkers
has_many :articles, :through => :linkers, :foreign_key => :article_id
accepts_nested_attributes_for :articles
end
class Article < ActiveRecord::Base
has_many :linkers
has_many :topics, :through => :linkers, :foreign_key => :topic_id
end
class Linker < ActiveRecord::Base
#this is the join model, has extra attributes like "relevance"
belongs_to :topic
belongs_to :article
end
Run Code Online (Sandbox Code Playgroud)
所以当我在主题控制器的"新"动作中构建文章时......
@topic.articles.build
Run Code Online (Sandbox Code Playgroud)
...并在topics/new.html.erb中创建嵌套表单...
<% form_for(@topic) do |topic_form| %>
...fields...
<% topic_form.fields_for :articles do |article_form| %>
...fields...
Run Code Online (Sandbox Code Playgroud)
... Rails自动创建链接器,这很棒. 现在我的问题是:我的链接器模型还具有我希望能够通过"新主题"表单更改的属性.但是Rails自动创建的链接器除了topic_id和article_id之外,其所有属性都有nil值.如何将其他链接器属性的字段放入"新主题"表单中,这样它们就不会出现?
嗨(巨大的Rails新手在这里),我有以下型号:
class Shop < ActiveRecord::Base
belongs_to :user
validates_uniqueness_of :title, :user_id, :message => "is already being used"
end
Run Code Online (Sandbox Code Playgroud)
和
class User < ActiveRecord::Base
has_one :shop, :dependent => :destroy
end
Run Code Online (Sandbox Code Playgroud)
当我即将创建一个新商店时,我收到以下错误:
private method `create' called for nil:NilClass
Run Code Online (Sandbox Code Playgroud)
这是我的控制器:
@user = current_user
@shop = @user.shop.create(params[:shop])
Run Code Online (Sandbox Code Playgroud)
我通过阅读指南和教程尝试了不同的变化,但我比以前更困惑,无法让它工作.任何帮助将不胜感激.
例
class User
has_many :tickets
end
Run Code Online (Sandbox Code Playgroud)
我想创建包含用户计数票据逻辑的关联,并在包含中使用它(用户has_one ticket_count)
Users.includes(:tickets_count)
Run Code Online (Sandbox Code Playgroud)
我试过了
has_one :tickets_count, :select => "COUNT(*) as tickets_count,tickets.user_id " ,:class_name => 'Ticket', :group => "tickets.user_id", :readonly => true
User.includes(:tickets_count)
ArgumentError: Unknown key: group
Run Code Online (Sandbox Code Playgroud)
在这种情况下,include中的关联查询应该使用count with group by ...如何使用rails实现这一点?
更新
UPDATE2
我知道SQL,我知道如何用连接选择它,但我的问题现在就像"如何获取数据".我的问题是关于建立我可以在包含中使用的关联.谢谢
Update3 我尝试创建像用户has_one ticket_count创建的关联,但是
ruby activerecord ruby-on-rails active-relation ruby-on-rails-3
我有用户的表格
<%= form_for(@user) do |f| %>
<%= f.fields_for :businesses do |field| %>
<div class="field">
<%= field.label :address %>
<%= field.text_field :address %>
</div>
<div class="field">
<%= field.label :city %>
<%= field.text_field :city %>
</div>
<% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
它不显示我的字段,但是当我更改businesses为时business,它会显示,或者如果我f从 中删除f.fields_for. 但我认为它没有正确保存到数据库中。
我的用户模型
class User < ActiveRecord::Base
has_many :businesses
accepts_nested_attributes_for :businesses
en
Run Code Online (Sandbox Code Playgroud)
我的商业模式
class Business < ActiveRecord::Base
attr_accessible :user_id, :address, :city
belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)
我的商业移民
class CreateBusinesses < ActiveRecord::Migration
def change …Run Code Online (Sandbox Code Playgroud) ruby-on-rails nested-attributes ruby-on-rails-3 ruby-on-rails-3.2
我想知道我是否可以拥有多态关联和存在验证
假设我有一个business模型和一个address模型,并且address是多态的
class Business< ActiveRecord::Base
has_one :address, as: :addressable
validates_presence_of :address
end
class Address< ActiveRecord::Base
belongs_to :addressable, polymorphic: true
end
Run Code Online (Sandbox Code Playgroud)
有可能进行验证validates_presence_of :address吗?使用此设置创建对象时遇到问题.
我们首先要创建一个像这样的业务对象
b = Business.new(name: "Hello23")
b.address = Address.new(street: "House 43 BCD")
b.save!
Run Code Online (Sandbox Code Playgroud)
这不起作用.它给出了undefined method constantize for 0:Fixnum一个错误,因为当它试图将地址保存到db时,它找不到可寻址的id,因为业务尚未保存并且没有为其分配id .
但是从另一方面来说也是不可能的 - 如果没有地址我就无法保存业务.
处理这种情况的最佳方法是什么?
****除此之外,如果我还想在地址方面进行验证,就像这样**
validates_presence_of :addressable
Run Code Online (Sandbox Code Playgroud)
我已经在这2天内一直在努力解决这一切.让我们看看你们有什么想法?**